[英]Implicit internal linkage not the same as explicit internal linkage (“static”)?
今天我遇到了一個特殊性,雖然可能不是很重要,但讓我感到困惑。 也許我也只是不正確理解 C++ 。
源文件中的一些 arrays 指向字符串文字,如下所示:
const char* a[] = { "a", "b", "c" };
const char* b[] = { "d", "e"};
const char* c[] = { "f", "g"};
None of these pointer arrays is ever used in any way other than being passed to GetProcAddress
to retrieve a function pointer from a library (this is a non-blocking dynamic OpenAL/EFX/capture function loader and context creator/manager).
我最終想到,我可能應該將這些變量聲明為static const
,因為在very.cpp 文件之外的任何地方都不需要它們,因此明確內部鏈接似乎是合適的。 它們無論如何都應該有內部鏈接(ISO14882 3.5(3)),所以我們只是通過明確編譯器已經假設的內容來成為好公民。
進行這種無害的更改導致可執行文件大小增加了 512 字節。 不像額外的 512b 真的很重要,但完全相同的事情會導致不同的代碼似乎沒有意義。 由於不推薦使用static const
(ISO14882 7.3.1.1(2)),我也嘗試了匿名命名空間,結果相同。
查看匯編源代碼表明,顯式內部鏈接( static
或namespace{}
)會將字符串文字移動到.rdata
而不是.data
中,並且字符串文字與指向字符串文字的指針 arrays 交錯,而不是全部字符串和一個塊中的所有指針,分別。 這也可能是大小不同的原因——很可能將數據從一個部分改組到另一個部分已經達到了部分大小限制。 有趣的是,所有 3 種口味的名稱也不同。
現在我想知道:我是否犯了一個謬誤,這些指針是否應該沒有內部鏈接?
另外,據我所知, const
已經是只讀的, static const
“更多只讀”(一個進入.rdata
,另一個沒有)?
您的 arrays未聲明const
,因此它們也不是隱式內部鏈接。 您所擁有的是指向常量的非 const arrays。
也就是說,我不知道為什么這會影響字符串是否以.rdata
或.data
結尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.