c++ - 内联函数时的编译器限制

标签 c++ inline

我知道在为类成员函数添加 inline 关键字后,如果“函数不复杂”或函数体中有“很多语句”,编译器会决定内联。

  1. 什么算“很多语句”?

  2. 如果隐式或显式获取函数地址,编译器也无法执行内联。谁能解释一下这一点?

  3. 因为内联只是一个建议,我该如何测试哪些函数没有被内联?

最佳答案

  1. 这完全取决于编译器;这可能取决于优化设置、目标体系结构的特性(例如,函数调用的成本与由于代码大小增加而导致的缓存未命中的潜在成本)以及该函数与其余代码的集成程度在特定的调用站点。

  2. 如果一个函数总是内联的,它就不再作为一个函数单独存在,因为它的指令直接放在调用点上,与调用者代码的其余部分一起;由于这个原因,这样的函数不再有地址,因为它与调用者混合在一起。但是,当您请求函数地址时,通常会发生的情况是,编译器会在它最喜欢的任何地方内联该函数,但仍将其作为“常规函数”发出,并通过函数指针使用其地址.

  3. 您可以反汇编生成的可执行文件,或者要求您的编译器发出程序集而不是构建完成的可执行文件(使用 gcc-S 选项)并手动检查。尽管如此,请注意,检查优化的二进制文件并非易事 - 由于内联代码与调用者代码混合在一起,因此可能很难准确找出内联函数的去向,同时您可能还会发现非内联拷贝通过函数指针使用的函数(如上所述)。

关于c++ - 内联函数时的编译器限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277348/

相关文章:

java - C++代码覆盖工具

c++ - 在 Qt widget/QWindow 上显示过剩窗口

c++ - std::vector pop_back() 实现

c++ - 在源文件 (cpp) 中定义带有静态和内联的模板函数有哪些优势?

c++ - 使用 C 和 C++ 的 Protocol Buffer

c++ - 面试 - 在数组中找到偶数和对

ruby - 是否可以将 `retry` 关键字与 `if` 内联使用?

rust - 为什么将函数移动到结构上的方法时,#[inline] 属性会停止工作?

jquery - 克隆背景图像并在文件名中添加括号

c++ - 内联或相同的代码