2013-06-28 63 views
6

編譯器是否可以自由地對非標準佈局類中的數據進行重新排序?例如,是否允許改變對非標準佈局類的佈局限制

struct 
{ 
    char x; 
private: 
    short y; 
public: 
    char z; 
}; 

struct 
{ 
private: 
    short y; 
public: 
    char x; 
    char z; 
}; 

回答

8

編輯:我記錯報價原來,編譯器允許這樣做,每9.2/14

非靜態數據成員分配一個具有相同訪問控制權(第11章)的(非聯合)類,以便後面的成員在類對象中擁有更高的地址。未指定具有不同訪問控制的非靜態 數據成員的分配順序(11)。 執行對齊需求可能會導致兩個相鄰成員 不會立即被分配;所以可能會爲空間 要求管理虛擬功能(10.3)和 虛基類(10.1)

什麼不能做的是重新排序以相同的訪問說明符屬性。

這就是說,我不知道任何實現,即使在訪問說明符中,也可以自由地重新排序屬性。

+0

編譯器不允許更改每個訪問規範中的順序。每個訪問規範的順序都是未指定的。編譯器被允許執行O.P.演示的內容。 – John

+0

+1:我一直想知道爲什麼這是標準版。 –