Компилятор выполняет одно и то же действие для всех вызовов встроенных функций?
Принимает ли компилятор C++ разные решения относительно включения двух разных вызовов одной и той же встроенной функции?
рассмотрим код вроде этого:
inline func(int x) {
return x + (x << 1) + (x << 2) + (x << 3) + (x << 4);
}
int main() {
int y = func(1) + func(2) + func(3) + func(4);
for(int i = 0; i < 100000000; ++i)
y += func(i % 10);
cout << y << endl;
return 0;
}
будет ли компилятор делать то же действие с вызовами до цикла и внутри цикла? если мы рассматриваем длину кода вместе с оптимизацией скорости, то вызовы перед циклом не должны быть встроенными, а вызовы внутри должны.
1 ответ
Это зависит от вашего компилятора. Допустим, вы используете gcc 5.4.0
с -O2
уровень оптимизации. Первая строка внутри main
функция
int y = func(1) + func(2) + func(3) + func(4);
будет вычисляться во время компиляции из-за целочисленных литералов и кода внутри for
Цикл будет встроен. Но если вы используете другой компилятор или другой уровень оптимизации, результат может быть другим.
Если вы хотите проверить вывод сборки вашего кода, используйте Compiler Explorer, который является онлайн и бесплатным инструментом.