Это наиболее читаемая и наиболее эффективная версия функции.
int calcme(int a, int b)
{
return a*20 + b;
}
Если вы поместите константу в переменную static
, возможно, компилятор выяснит, что она никогда не изменилась, и преобразуетэто к непосредственному операнду.Возможно, компилятор не поймет это и загрузит статические данные из памяти.
Если вы поместите константу в глобальную переменную, компилятор загрузит переменную из памяти.
Выпытаются перехитрить оптимизатор, и это почти всегда плохая идея.
Вот ваш оригинальный код, скомпилированный:
leal (%rdi,%rdi,4), %edi
leal (%rsi,%rdi,4), %eax
ret
Это тот же код, сгенерированный return a*20 + b;
,но твой код труднее читать.Обратите внимание, что статическая переменная на самом деле нигде не сохраняется, она преобразуется в непосредственный операнд (а затем уменьшение прочности еще больше уменьшает его).Точно такую же производительность вы получите из следующего кода:
int calcme(int a, int b)
{
int local = 20; // "initialized" every time the function is called
// yet the assembly is the same
return a*local + b;
}