编译器优化问题

Compiler optimization issue

本文关键字:问题 优化 编译器      更新时间:2023-10-16

编译以下内容会导致T::f()在没有任何警告或错误的情况下被优化:

#include <iostream>
struct T
{
    int t;
    void f(); //undefined..
};
int main()
{
    T t;
    t.t = 1;
    //t.f(); //<-- compiler-error only when used, otherwise optimized-out
    std::cout << t.t;
    return 0;
}

背景:我为类中的函数使用了存根声明,以便以后定义和使用它们后来'再也没有来过,我的代码编译了&编译器没有发出关于这些存根的警告或错误。

这是编译器所期望的吗?;编译器不应该至少发出警告吗?

这不是"优化"。C++编译器允许您声明任何您想要的东西,前提是声明在语法上是有效的,并且不引用未定义的类型。这并不是成员函数特有的:可以在不提供相应定义的情况下声明非成员函数和全局变量。

事实证明,编译器和链接器都不适合抱怨未完成的声明。由于可能单独汇编,即使发出警告也会有问题。

编译器不会抱怨,因为它知道另一个cpp文件可能会提供定义,并且当链接器运行时,声明已经不见了:链接器使用定义和引用,而声明则用于编译器。

来自评论:

有数百(甚至数千)个"未被应用程序调用"功能在system.h文件中。编译器不知道代码所在的位置:在.cpp源文件中,或在预编译的.obj/.o或.dll/.so中等等。这是链接器的职责,而不是编译器的职责。所以编译器默默地忽略每一个没有"身体"的签名user4419802

编译器没有优化任何东西,因为一开始没有什么可以优化的。当您声明void T::f();时,您所做的只是向编译器的内部字典添加一个方法签名(如果您愿意的话)。你从来没有给这个方法一个相应的主体,也从来没有调用过它,所以它只是"从未发生过"。

编译器不知道你是否要在另一个编译单元中声明T::f(),它也不在乎,因为它"知道"如果你不这样做,你会得到一个链接器错误。