сборка — Почему встроенная функция C ++ имеет инструкции по вызову?

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

Согласно приведенному выше объяснению не должно быть никакого вызова функции, когда inline это пользователь.

Если это так Почему я вижу три call инструкции в ассемблерном коде?

#include <iostream>

inline int add(int x, int y)
{
return x+ y;
}

int main()
{
add(8,9);
add(20,10);
add(100,233);
}

meow@vikkyhacks ~/Arena/c/temp $ g++ -c a.cpp
meow@vikkyhacks ~/Arena/c/temp $ objdump -M intel -d a.o
0000000000000000 <main>:
0:   55                      push   rbp
1:   48 89 e5                mov    rbp,rsp
4:   be 09 00 00 00          mov    esi,0x9
9:   bf 08 00 00 00          mov    edi,0x8
e:   e8 00 00 00 00          call   13 <main+0x13>
13:   be 0a 00 00 00          mov    esi,0xa
18:   bf 14 00 00 00          mov    edi,0x14
1d:   e8 00 00 00 00          call   22 <main+0x22>
22:   be e9 00 00 00          mov    esi,0xe9
27:   bf 64 00 00 00          mov    edi,0x64
2c:   e8 00 00 00 00          call   31 <main+0x31>
31:   b8 00 00 00 00          mov    eax,0x0
36:   5d                      pop    rbp
37:   c3                      ret

НОТА

Полный дамп объектного файла Вот

3

Решение

  • Вы не оптимизировали, поэтому звонки не встроены
  • Вы создали объектный файл (не .exe), поэтому вызовы не разрешаются. То, что вы видите, является фиктивным звонком, адрес которого будет заполнен компоновщиком
  • Если вы скомпилируете полный исполняемый файл, вы увидите правильные адреса для переходов

Смотрите страницу 28 из:
http://www.cs.princeton.edu/courses/archive/spr04/cos217/lectures/Assembler.pdf

6

Другие решения


По вопросам рекламы [email protected]