簡體   English   中英

GCC:static 數據成員在調試版本中優化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM