2011-06-30 94 views
8

今天我遇到了一個雖然可能不是很重要,但讓我困惑的事物。也許我只是不正確地理解C++。隱式內部鏈接與顯式內部鏈接不同(「靜態」)?

源文件點中的一些陣列字符串文字,就像這樣:

這些指針數組的
const char* a[] = { "a", "b", "c" }; 
const char* b[] = { "d", "e"}; 
const char* c[] = { "f", "g"}; 

沒有比傳遞給GetProcAddress從庫中檢索函數指針其他任何方式使用過(這是一個非阻塞的動態OpenAL/EFX /捕獲函數加載器和上下文創建器/管理器)。

我最終想到,我應該聲明這些變量爲static const,因爲在非常.cpp文件之外的任何地方都不需要它們,所以明確地建立內部連接似乎是合適的。無論如何,它們都應該有內部聯繫(ISO14882 3.5(3)),所以我們只是通過明確編譯器已經假定的東西來成爲好公民。

這樣做無辜更改導致可執行文件大小增加512字節。不像額外的512b真的很重要,但它似乎沒有道理,完全相同的東西會導致不同的代碼。由於static const已被棄用(ISO14882 7.3.1.1(2)),我也嘗試了匿名命名空間,結果相同。

尋找在彙編源程序示出了顯式的內部連接(staticnamespace{})將字符串文字移入.rdata而非.data,並且字符串文字是交錯的,而不是具有所有與指針到字串文本陣列,字符串和一個塊中的所有指針。這裏可能是不同大小的原因 - 很可能將數據從一個部分移動到另一個部分已經達到了部分大小限制。有趣的是,所有3種口味也都不同。

現在我想知道:我是否犯了一個謬論,應該是那些指針不是有內部聯動嗎?

此外,在我的理解const已經是隻讀的,inhowfar是static const「更多隻讀」(一個進入.rdata和其他沒有)?

回答

7

您的數組是而不是宣佈爲const,因此它們也不是隱式內部連接。你有什麼是指向const的非const數組。

這就是說,我不知道爲什麼這會影響字符串是否以.rdata.data結尾。

+0

哦,我的,當然......我的一個愚蠢的,明顯的錯誤。實際上,它應該是'const char * const a []',它的行爲也如預期一樣(隱式內部鏈接,並具有相同的變形)。如果數組不是const,那麼爲什麼非常量指針將會在'.data'中。只是文字,我不知道......我希望這些在任何情況下都是隻讀的。仍然,優秀的捕獲。 – Damon