当调用类内联函数时,编译器会真正做什么

What does compiler really do when a class inline function is called?

本文关键字:编译器 什么 调用 函数      更新时间:2023-10-16

无静态成员函数隐式具有this指针。因此,这些内联函数在班级外被称为编译器时不会被编译器替换,对吗?这似乎使用类内联函数非常限制!

优化编译器可以按照自己的意愿进行内联。

例如,您可以编译和link 带有g++ -flto -O2的整个程序(链接时间整个程序优化选项GCC ...)。

(警告:使用g++ -flto -O2会大大减慢您的构建过程;基本上所有内容几乎是"两次"的,一次是在"编译"时间,一次在"链接"时间,在"链接"时间,其中gimple表示会重新优化)

您会惊讶于哪些函数被绑定了(其中许多可能是)。它与标记或不标记为inline的静态功能无关。

因此,您不应该 Care 关于内部(这是一个实现和优化细节),但是您 Hope 编译器会做得很好。

(有时使用g++,您要禁用大多数插入的内容,以便用gdb;然后用g++ -fno-inline -Wall -Wextra -O0 -g编译)

因此,这些内联函数在班级外被称为编译器时不会被编译器替换,对吗?

您错了,this只是一个隐式参数(另请参见),当然,编译器通常是在呼叫对成员函数的调用。如果编译器没有优化(由于许多成员函数-e.g。getters and seters),在练习中 c 效率很低 - 很短而且很快)。

请记住,C 是某些报告中写入的规范(这不是编译器)。内部是实施问题的质量,也可能发生或不发生。

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

称为内联成员函数时,编译器对任何函数呼叫的作用:准备参数并调用函数。任何功能调用都符合内联。某些函数不能被嵌入(例如使用alloca或Vararg函数,定义不可用的函数),但成员函数不能阻止内部插入。

相关文章: