Я знаю, что то, как аргументы передаются функциям, не является частью стандарта C и зависит от архитектуры оборудования и соглашения о вызовах.
Я также знаю, что оптимизирующий компиляторможет автоматически встроить функции, чтобы сэкономить на издержках вызова, и пропустить код, который не имеет «побочных эффектов».
Но у меня есть вопрос по поводу конкретного случая:
Допустим, есть нетривиальная функция, котораяне может быть встроен или удален, и должен быть вызван, который объявлен без аргументов:
int veryImportantFunc() {
/* do some important stuff */
return result;
}
Но эта функция вызывается с аргументами:
int result = veryImportantFunc(1, 2, 3);
Разрешен ли компиляторвызвать функцию, не передавая эти аргументы?
Или есть какие-то стандартные или технические ограничения, которые бы препятствовали такого рода оптимизации?
Кроме того, что если оценка аргумента имеет побочные эффекты:
int counter = 1;
int result = veryImportantFunc(1, ++counter, 3);
Обязан ли компилятор выполнять оценку даже без передачи результата, или было бы законно отбросить оценку, оставив counter == 1
?
И, наконец, как насчет дополнительных аргументов:
char* anotherFunc(int answer) {
/* Do stuff */
return question;
}
, если эта функция вызывается так:
char* question = anotherFunc(42, 1);
Может ли 1 быть отброшенокомпилятор, основанный на объявлении функции?
РЕДАКТИРОВАТЬ: Чтобы уточнить: я не собираюсь писать код, который есть в моих примерах, и я не нашел этого ни в одном коде, который яЯ работаю над этим.
Этот вопрос предназначен для того, чтобы узнать о том, как работают компиляторы и что говорят соответствующие стандарты, поэтому всем, кто посоветовал мне держаться подальше от такого рода кода: спасибо, но я уже это знаю.