GCC:在调试构建中优化的静态数据成员
GCC: static data member optimized out in the debug build
考虑以下简单代码:
template<typename T>
struct Base {
static constexpr int v = 0;
};
struct Derived : Base<int> {};
int main() {
Derived d;
}
我用GCC(8.3.0,9.1.0,g++ -g -O0 test.cpp
(编译它,然后运行GDB来检查d
:的值
(gdb) p d
$1 = {<Base<int>> = {static v = <optimized out>}, <No data fields>}
d.v
不见了。。。我尝试使用-ggdb
、-ggdb3
、-fvar-tracking
,但没有成功。
如果我用clang(clang++ -g -O0 test.cpp
(编译,我会看到预期的结果:
(gdb) p d
$1 = {<Base<int>> = {static v = 0}, <No data fields>}
如果Base
不是模板类,GCC也可以看到此输出:
(gdb) p d
$1 = {<Base> = {static v = 0}, <No data fields>}
d.v
去了哪里?为什么要进行优化?是否可以在不修改源代码的情况下阻止这种优化?
即使它不必尊重它,但通过使用constexpr
并提供初始化值,您强烈暗示编译器它应该常量折叠Base::v。
Gcc有一个-fkeep-static-consts
标志,它可能会执行您想要的操作。
相关文章:
- C++编译器是否优化了顺序静态变量读取?
- 未使用的C++未优化的静态成员函数/变量
- 如何使用 GCC 编译器优化创建静态库?
- GCC:在调试构建中优化的静态数据成员
- 静态 constexpr 的编译器优化
- 静态局部变量会被错误地优化吗?
- 具有必要副作用的静态初始化被优化掉了
- 线程上下文上的静态存储对象优化
- 使用LTO静态链接的可执行文件(链接时间优化):如何使用以前构建的库进行制作
- 如何防止优化静态常量
- 有没有办法强制c++编译器不优化静态库中的特定静态对象
- 静态函数编译器优化C++
- 了解工厂方法和静态变量赋值的返回值优化 (Visual Studio)
- 如何避免 C++ 编译器优化器删除静态变量代码
- 如果一个类不是直接从main中使用的,但有一个静态私有成员,那么在编译和链接时,可以使用最大优化来忽略它吗
- 编译器是否足够聪明,可以优化成员与静态方法参数相同的函子
- 未在类中使用const静态变量优化出来
- 静态初始化器在库中会被优化掉
- G++ 4.9 上静态 constexpr 的未定义引用,没有优化
- 编译器会优化出静态函数未使用的参数吗?