[英]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
) 編譯它,然后運行d
的值:
(gdb) p d
$1 = {<Base<int>> = {static v = <optimized out>}, <No data fields>}
dv
不見了...我嘗試使用-ggdb
, -ggdb3
, -fvar-tracking
沒有成功。
如果我使用 clang ( clang++ -g -O0 test.cpp
) 編譯,我會看到預期的結果:
(gdb) p d
$1 = {<Base<int>> = {static v = 0}, <No data fields>}
如果Base
不是模板 class,則此 output 也與 GCC 一起出現:
(gdb) p d
$1 = {<Base> = {static v = 0}, <No data fields>}
dv
go 在哪里? 為什么優化出來了? 是否可以在不修改源代碼的情況下阻止這種優化?
即使它不必尊重它,通過使用constexpr
並提供一個初始化值,你也強烈暗示編譯器它應該對 Base::v 進行常量折疊。
Gcc 有一個-fkeep-static-consts
標志,可以做你想做的事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.