2008-10-03 55 views
1

考慮這兩個C++頭的情況:靜態數組常量是否影響共享庫佈局?

情況1:

class Test { 
    public: 
    static int TEST_DATA[]; 
}; 
int Test::TEST_DATA[] = { 1, 2, 3, 4 }; 

情況2:

class Test { 
    public: 
    static int const TEST_DATA[]; 
}; 
int const Test::TEST_DATA[] = { 1, 2, 3, 4 }; 

是在後一種情況下,只有對自我施加的編譯時檢查或確實常量它會影響Mac/Linux/Windows上的共享庫佈局?

更新:根據回答,編譯器可能會把常量放在只讀頁面上。 是否 Windows或GCC上的Visual C++ 在Mac或Linux上實際上是將const數據放在只讀頁面上?也許我測試了錯誤的方式,但在Intel上的Mac上,const版本的元素似乎是可寫的。

回答

2

編譯器可能會將數據放入二進制文件的不同部分,具體取決於它是否爲常量 - 這完全取決於編譯器。

0

儘管沒有保證,但在數組情況下,const不太可能破壞二進制兼容性,因此共享庫最終應該具有相同的佈局。

注意這可能會爲單個int的情況:

struct Test 
{ 
    static int const TEST; 
}; 
int const Test::TEST = 7; 

,因爲測試是一個編譯時間常數。

1

編譯器(或實際上是鏈接器)可能會將第二個放入標記爲只讀的段中,以便在嘗試寫入時觸發硬件異常。由於寫入不打算寫入的內容是安全攻擊的載體,因此更多系統正在保護其只讀數據。