Интересно, как приведение функции в пустоту повлияет на скорость. Под этим я имею в виду:
int a,b;
int main (){
(void)my_func();
}
int my_func(){
return a+b;
}
Что с этим сделает компилятор?
int a,b;
int main (){
my_func();
}
int my_func(){
return a+b;
}
Какой из этих блоков кода будет быстрее. Если ни одного из них, то какова цель записи (void) перед вызовом функции?
Я пришел сюда, чтобы сказать то же самое, что и кинер_шах. Сгенерированный код будет идентичен. Сравнить можно здесь и здесь. Обращение результата возврата функции к (void) — это распространенный способ указать: «Я намеренно игнорирую возвращаемый результат». Его часто используют, чтобы сообщить инструментам компилятора и анализа кода не выдавать предупреждение.
При оптимизации компилятор вообще не будет создавать никакого кода для вызова my_func
, поскольку он не имеет побочных эффектов. См. godbolt.org/z/eqj1oqefh
Если вы исправите недостающую ошибку прототипа, обе программы сведутся к пустой функции main(), которая ничего не делает. Он будет работать великолепно, поскольку выполняются только инструкции xor eax, eax
и ret
.
Для скорости это не имеет никакого значения. С приведением или без него возвращаемое значение отбрасывается. В любом случае это происходит мгновенно.
В языке C программисту не следует слишком беспокоиться об оптимизации низкого уровня(*). Мантра гласит, что компилятор умнее вас. Это означает, что такие детали низкого уровня обычно обрабатываются оптимизирующими компиляторами.
Что должно иметь значение:
Здесь приведение (void)
в основном говорит о том, что программист добровольно отбросил возвращаемое значение и что он не забыл его по ошибке.
(*) Что касается любого правила, то, конечно же, есть исключения. Когда вы пишете код, время выполнения которого имеет решающее значение, вам следует тщательно его профилировать и позаботиться о низкоуровневой оптимизации в тех частях, на которые тратится больше всего времени. Но вы должны знать, что эти оптимизации имеют смысл только для конкретной архитектуры и конкретного компилятора. В этом случае даже было принято использовать язык ассемблера.
В данном случае void предназначен для игнорирования возвращаемого значения функции. Если предупреждения включены, возможно, компилятор выдаст одно из них за игнорирование возвращаемого значения.