2008-11-14 59 views
1

C++標準強制對內存中的類成員變量進行排序。它表示,成員變量的地址必須按聲明的順序增加,但只能在一個訪問部分內。非常特別的是,這似乎並不妨礙編譯器以交錯的方式佈局訪問部分。例如:C++訪問節可以交錯嗎?

class X { 
public: 
    int i; 
    int j; 
private: 
    int k; 
    int n; 
} 

該標準是否允許編譯器按照i,k,j,n的順序排列數據成員?這將使編譯器在不違反標準的情況下優化對象佈局的一些(有限)自由。

回答

3

我檢出了C++標準。在第9.2節,段落(或子句或其他)12中,它說:「由訪問說明符分隔的非靜態數據成員的分配順序未指定。」 「未指定」表示不需要記錄的依賴於實現的行爲。

因此,該標準明確地沒有說明分配,除了我必須在j和k之前必須在n之前。因此,允許編譯器按照i,k,j,n的順序進行分配,並且不需要記錄任何有關排序的信息。

+0

感謝您的回答,這是相當明確的。我想知道是否有任何編譯器利用這種可能性來減少對象內的填充。 – 2012-04-07 16:37:29

2

不,我認爲他沒有試圖發送垃圾郵件。這是一個有效的問題,我覺得很有意思。

好了,現在我認爲編譯器可以做到這一點。該標準在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).

1

我解釋標準的方式,它看到的代碼示例如下:因爲有i和j之間沒有訪問說明符,我的地址必須拿出j的地址之前。建議的排序滿足這一點。同上k和n。所以在我的解釋中,編譯器允許使用這個順序。