调用类内联函数时编译器真正做了什么?

时间:2017-09-22 08:16:52

标签: c++ class inline

没有静态成员函数隐式具有this指针。所以这些内联函数在类外调用时不会被编译器替换,对吗?这似乎是类内联函数的使用非常严格!

2 个答案:

答案 0 :(得分:2)

当调用内联成员函数时,编译器会执行它对任何函数调用所做的操作:准备参数并调用函数。任何函数调用都需要内联。某些函数无法内联(e.g. functions using alloca or vararg functions,其定义不可用的函数),但成员函数不会阻止内联。

答案 1 :(得分:2)

优化编译器可以inline按照自己的意愿。

例如,您可以使用g++ -flto -O2编译并链接整个程序(optimization option的链接时整个程序GCC ...)。< / p>

(警告:使用g++ -flto -O2会大大减慢你的构建过程;基本上所有东西都编译得几乎“两次”,一次是在“编译”时,一次是在“链接”时间,GIMPLE表示获得重新优化)功能

你会惊讶于内联函数调用(其中很多都可以)。它与静态或不标记为inline的函数无关。

所以你不应该关心关于内联(这是一个实现和优化细节),但你希望编译器能做得很好。

(有时使用g++您要禁用大多数内联以简化gdb的调试;然后编译with g++ -fno-inline -Wall -Wextra -O0 -g

  

所以这些内联函数在类外调用时不会被编译器替换,对吗?

你错了,this只是一个隐式参数(另请参阅that),当然编译器通常会内联对成员函数的调用。在 practice 中,如果编译器没有进行优化(因为很多成员函数 - 例如getter和setters - 非常简短而且很快),C ++效率会很低。

请记住,C ++是在某些报告中编写的规范(它不是编译器)。内联是一种实施质量问题,可能会也可能不会发生。

如果您关心编译器真正做了什么(并且您不应该关心,但是您需要在代码中避免使用undefined behavior),请让它显示生成的汇编代码。使用GCC汇编g++ -O2 -fverbose-asm -S以从foo.s翻译单元获取foo.cc汇编程序文件。