只是想验证在 VC++ 中,从未调用过的未使用的成员函数默认情况下被编译器视为内联函数?如果是这样为什么会这样,为什么不完全丢弃(因为它永远不会被调用)这个函数而不是内联呢?
有什么好处?
更新问题是为什么在永远不会调用它的时候内联它?为什么不简单地永远丢弃它,就像丢弃一些未使用的变量一样。
只是想验证在 VC++ 中,从未调用过的未使用的成员函数默认情况下被编译器视为内联函数?如果是这样为什么会这样,为什么不完全丢弃(因为它永远不会被调用)这个函数而不是内联呢?
有什么好处?
更新问题是为什么在永远不会调用它的时候内联它?为什么不简单地永远丢弃它,就像丢弃一些未使用的变量一样。
inline
如果成员函数在类定义的主体中定义,则在不使用关键字的情况下将其视为内联。他们是否被调用与它无关。
未使用的成员函数通常不能被丢弃,因为它们的名称具有外部链接 - 也就是说,某些其他翻译单元或可执行文件可能会调用它们,甚至在编译此翻译单元或此可执行文件时还没有编写已连接。
一旦到达链接时间,如果实现以某种方式知道这不可能发生,那么它可以丢弃该函数的代码。例如,因为操作系统无法在可执行文件中查找符号,或者因为您已经告诉链接器使用某些实现定义的选项将它们删除。
尤其是与 VC++ 相关:在 Windows 上,您可以在可执行文件中查找符号(如果它们是dllexport
. 所以这些函数即使在链接时通常也不会被丢弃,而其他未使用的函数也不能仅仅因为这个 TU 不使用它而在编译时被丢弃。对于以通常方式定义的大多数类,具有声明成员函数的头文件和定义它们的源文件,这些函数在该源文件中未使用。因此,如果编译器因为它们在那个 TU 中未使用而丢弃它们,那么什么都不会起作用。
我认为(我不确定)函数是否内联与它是否可以被丢弃有关,但可能并不意味着它可以完全被丢弃。确实,如果它是内联的,并且有人调用它,那么有人必须在他们的 TU 中有函数的定义。所以从某种意义上说,这个功能是“不需要的”。但是,static
无论从哪个 TU 调用任何局部变量都必须共享,并且无论采用哪个 TU,函数本身的地址都必须相同。因此即使不是该函数的完整代码。
但正如我所说——即使内联函数在未使用时可以被丢弃,并非所有未使用的函数都是内联的。
内联它在哪里?它从未被调用,因此不可能将其内联到任何调用站点。
该标准规定函数是否被视为内联。它是否被调用是无关紧要的。