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