Компилятор выполняет одно и то же действие для всех вызовов встроенных функций?

Принимает ли компилятор 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, который является онлайн и бесплатным инструментом.

Другие вопросы по тегам