gpt4 book ai didi

c++ - 编译优化问题

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:21 24 4
gpt4 key购买 nike

编译以下导致 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;
}

背景:我对类中的函数使用 stub 声明,目的是稍后定义和使用它们。 “稍后”从未出现,我的代码已编译并且编译器没有发出有关这些 stub 的警告或错误。

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

最佳答案

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

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

编译器不会提示,因为它知道另一个 cpp 文件可能会提供定义,并且当链接器运行时,声明已经消失:链接器处理定义和引用,而声明用于编译器。

来自评论:

There are hundreds (or even thousands) "not called by app" functions in system .h files. The compiler doesn't know where the code resides: either in your .cpp source, or in precompiled .obj/.o, or in .dll/.so etc.etc. It's linker's duty, not the compiler's one. So the compiler silently ignores every signature without "body". – user4419802

关于c++ - 编译优化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29206030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com