C++標準強制對內存中的類成員變量進行排序。它表示,成員變量的地址必須按聲明的順序增加,但只能在一個訪問部分內。非常特別的是,這似乎並不妨礙編譯器以交錯的方式佈局訪問部分。例如:C++訪問節可以交錯嗎?
class X {
public:
int i;
int j;
private:
int k;
int n;
}
該標準是否允許編譯器按照i,k,j,n的順序排列數據成員?這將使編譯器在不違反標準的情況下優化對象佈局的一些(有限)自由。
C++標準強制對內存中的類成員變量進行排序。它表示,成員變量的地址必須按聲明的順序增加,但只能在一個訪問部分內。非常特別的是,這似乎並不妨礙編譯器以交錯的方式佈局訪問部分。例如:C++訪問節可以交錯嗎?
class X {
public:
int i;
int j;
private:
int k;
int n;
}
該標準是否允許編譯器按照i,k,j,n的順序排列數據成員?這將使編譯器在不違反標準的情況下優化對象佈局的一些(有限)自由。
我檢出了C++標準。在第9.2節,段落(或子句或其他)12中,它說:「由訪問說明符分隔的非靜態數據成員的分配順序未指定。」 「未指定」表示不需要記錄的依賴於實現的行爲。
因此,該標準明確地沒有說明分配,除了我必須在j和k之前必須在n之前。因此,允許編譯器按照i,k,j,n的順序進行分配,並且不需要記錄任何有關排序的信息。
不,我認爲他沒有試圖發送垃圾郵件。這是一個有效的問題,我覺得很有意思。
好了,現在我認爲編譯器可以做到這一點。該標準在9.2中說過。 P12:
Implementation alignment require- ments might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).
我解釋標準的方式,它看到的代碼示例如下:因爲有i和j之間沒有訪問說明符,我的地址必須拿出j的地址之前。建議的排序滿足這一點。同上k和n。所以在我的解釋中,編譯器是允許使用這個順序。
感謝您的回答,這是相當明確的。我想知道是否有任何編譯器利用這種可能性來減少對象內的填充。 – 2012-04-07 16:37:29