Почему gcc / clang не встроен даже на самом высоком уровне оптимизации - PullRequest
0 голосов
/ 05 июля 2019

Мне интересно, почему функция foobar() не встроена в gcc / clang. Даже при -O3 вставка не выполняется. Я бы ожидал, что GCC достаточно умен, чтобы сделать это. Если я добавлю ключевое слово inline в функцию, будет выполнено встраивание. Однако я подумал, что указание ключевого слова inline вручную является устаревшим.

Я также попытался скомпилировать этот пример на локальном компьютере с помощью gcc-8, но с теми же результатами.

#include <cstdio>

int foobar()
{   
   return 0;
}

int main()
{
    printf("%d", foobar());
}

Проводник компилятора.

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Они встроены даже без ключевого слова inline.Ваш пример был слишком тривиальным, и ввод не был необходим, поскольку возвращаемое значение было известно во время компиляции.

https://godbolt.org/z/tNcSrf

volatile int x;

int foobar(int x)
{   
   return x * x;
}

int main()
{
    printf("%d\n", foobar(x));
}

foobar:
        mul     r0, r0, r0
        bx      lr
main:
        push    {r3, lr}
        ldr     r3, .L5
        ldr     r0, .L5+4      //inlined here
        ldr     r1, [r3]
        mul     r1, r1, r1
        bl      printf
        movs    r0, #0
        pop     {r3, pc}
.L5:
        .word   x
        .word   .LC0
.LC0:
        .ascii  "%d\012\000"

оставляет копию функции, как ее можно вызватьиз другой единицы перевода.Если функция вызывается много раз в одном и том же модульном компиляторе, она может вообще не включать ее (в зависимости от параметров компиляции).

, чтобы убедиться, что функция всегда встроена, вам необходимо использовать атрибут

inline __attribute__((always_inline)) int foobar(int x);

или

static inline __attribute__((always_inline)) int foobar(int x);
0 голосов
/ 05 июля 2019

Ссылаясь на комментарий @Mat сверху:

"Звонок включен в ссылку, которую вы предоставляете, в main нет звонка на foobar."

К сожалению, я могу принять только мой ответв качестве решения через два дня.: - (

...