编译器优化问题
Compiler optimization issue
编译以下内容会导致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()
,它也不在乎,因为它"知道"如果你不这样做,你会得到一个链接器错误。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 无法理解代码背后的逻辑,这是在两个给定数字之间生成素数的优化问题
- 优化:黑客地球邮递员软件工程师实习生问题
- 关于使用类型转换优化除法代码的问题
- 优化递归问题以计算超级数字
- 在 c++ 中从 txt 文件中提取条目的代码优化问题
- [[GNU :: pure]]功能属性和线程的优化问题
- 由于Memcpy的问题,无法使用VS进行优化;被视为固有功能
- 编译器优化是否解决了线程安全问题
- 编译器优化问题
- 优化问题:整数加倍
- 求解整数约束优化问题
- 如何用Ceres求解大规模非线性优化问题
- 返回值优化问题
- 是否存在线程间共享变量的编译器优化问题
- 关于c++优化的问题
- iPhone代码优化问题