没有在类中优化使用const静态变量?

Gab*_*iel 1 c++ static compiler-optimization

一个合理的合适的编译器可以丢弃这个const静态变量

class A{
     const static int a = 3;
}
Run Code Online (Sandbox Code Playgroud)

如果在编译的二进制文件中没有使用它或者它是否在二进制文件中显示?

Mat*_*son 5

简短的回答:也许吧.标准并没有说编译器HAS保留常量(或字符串,或函数,或其他任何东西),如果它从未使用过.

答案很长:这在很大程度上取决于具体情况.如果编译器可以清楚地确定它没有被使用,它将删除未使用的常量.如果它无法做出该确定,则它不能删除未使用的常量,因为常量COULD可以被编译器当前不知道的东西使用(例如,另一个源文件).

例如,如果class A在函数内部,编译器可以知道此类未在其他地方使用,并且如果函数中未使用该常量,则不会在任何地方使用它.如果该类位于"全局"空间中,以便可以在其他地方使用,那么它将需要保持常量.

这通过"整个程序优化"或"链接时间优化"(从现在开始称为LTO)变得更加有趣,其中所有代码实际上被优化为一个大块,当然,"使用"或"未使用"可以确定所有可能的用途.

可以想象,结果还取决于编译器(以及LTO的链接器)的巧妙程度.所有编译器都应遵循"如有疑问保留"的原则.

您当然可以进行实验,并在使用变量的地方编写一些代码,然后删除使用,并查看它对汇编代码的不同之处(例如,g++ -S x.cpp或者clang++ -S x.cpp查看生成的xs文件).