c++ - 我如何知道内联函数是否在被调用的地方被实际替换?

标签 c++ inline

我知道内联函数要么在被调用的地方被替换,要么表现得像一个普通函数。

但是我如何知道内联函数是否在被调用的地方实际被替换,作为将内联函数视为内联的决定是在编译时?

最佳答案

在运行时以编程方式,您不能。
而事情的真相是:你不需要知道

编译器可以选择inline没有标记inline的函数或者忽略显式标记inline的函数,这完全是希望(读智慧) & 你应该相信编译器会明智地完成它的工作。大多数主流编译器都会很好地完成他们的工作。

如果您的问题纯粹是从学术角度来看,那么有几个选项可供选择:


分析生成的汇编代码:

您可以检查汇编代码以检查函数代码是否在调用点内联。

如何生成汇编代码?

对于 gcc:
编译时使用 -S 开关。
例如:

g++ -S FileName.cpp

生成的汇编代码被创建为文件FileName.s

对于 MSVC:
使用 /FA Switch 从命令行。

在生成的汇编代码中查找是否有针对特定函数的call汇编指令。


使用编译器特定的警告和诊断:

如果某些编译器未能遵守内联函数请求,它们会发出警告。
例如,在 gcc 中,如果编译器没有内联声明为内联的函数,-Winline 命令选项将发出警告。

检查 GCC documentation 了解更多详情:

-Winline

Warn if a function that is declared as inline cannot be inlined. Even with this option, the compiler does not warn about failures to inline functions declared in system headers.

The compiler uses a variety of heuristics to determine whether or not to inline a function. For example, the compiler takes into account the size of the function being inlined and the amount of inlining that has already been done in the current function. Therefore, seemingly insignificant changes in the source program can cause the warnings produced by -Winline to appear or disappear.

关于c++ - 我如何知道内联函数是否在被调用的地方被实际替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631283/

相关文章:

c++ - 将 C++ 代码导入 IOS 应用程序

perl - 带内联的子程序 perl

c - 一次引用的静态函数的优化

c++ - 编译器使用类的行为

python - cv::imshow 在 GUI 应用程序运行时阻塞线程

html - 在 HTML5 中,<div> 从技术上讲是 block 级元素,但其行为类似于内联元素。这是一个特殊的 'hybrid' 元素吗?

emacs - 如何自定义 emacs 内联代码的颜色、大小和字体

javascript - 内联函数和其他方法的作用域

c++ - Static Initialization Order Fiasco 为什么这样称呼?

C++ 使用默认值在 Struct 中实例化 2D Vector