当调用类内联函数时,编译器会真正做什么
What does compiler really do when a class inline function is called?
无静态成员函数隐式具有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函数,定义不可用的函数),但成员函数不能阻止内部插入。
- 编译器对数组声明大小的计算。什么时候发生?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 在使用包含冒号的类似函数的宏时,是什么导致了这种编译器差异?
- 我的设备上的 C++ 编译器版本是什么
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- 这个编译器错误究竟希望我执行什么?
- Visual Studio 编译器的 record-gcc-switch 相当于什么?
- 如果字符串在 C/C++ 中没有 NUL 字符(以防编译器允许它通过)会发生什么情况?
- 编译器在这里做什么,允许在很少进行实际比较的情况下比较许多值
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- openmpi 编译器有什么区别
- 使用不同的编译器 - 这有什么作用
- 编译器遇到返回语句时会做什么
- GCC,Apple LLVM和MSVC编译器的不同部分的名称是什么?
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- 编译器认为 int 是一个字符串.发生了什么事情
- 即使使用用户定义的构造函数,编译器什么时候仍会生成默认构造函数
- c++编译器什么时候开始考虑在字符串转义中使用两个以上的十六进制数字?