没有静态成员函数隐式具有this
指针。所以这些内联函数在类外调用时不会被编译器替换,对吗?这似乎是类内联函数的使用非常严格!
答案 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
汇编程序文件。