簡體   English   中英

類與結構的內存布局如何?

[英]How is the memory layout of a class vs. a struct

我來自C編程,其中結構中的數據首先是頂部變量,然后是第二個,第三個,依此類推。

我現在用C ++編程,而我正在使用類。 我基本上想要實現相同的目標,但我也想要獲取/設置方法,也可能需要其他方法(我也想嘗試用C ++風格進行操作,並且可能會學到新東西)。

是否有保證,例如公共變量將首先在內存中,然后是私有變量?

是否有保證,例如公共變量將首先在內存中,然后是私有變量?

不, 沒有做出這樣的保證 - C ++ 11標准,[class.mem] / 14:

分配具有相同訪問控制 (第11條)的(非聯合)類的非靜態數據成員,以便后面的成員在類對象中具有更高的地址。 未指定具有不同訪問控制的非靜態數據成員的分配順序 (11)。

所以

struct A
{
    int i, j;
    std::string str;

private:

    float f;

protected:

    double d;
};

只保證對於給定的A類對象,

  • i的地址小於j
  • j的地址小於str

請注意,類鍵structclass在布局方面沒有任何區別:它們唯一的區別是只在編譯時存在的訪問權限。


它只說順序,但不是第一個變量實際上從“第一個地址”開始? 讓我們假設一個沒有繼承的類。

是的,但僅適用於標准布局類 類必須滿足一系列要求才能成為標准布局類,其中之一是所有成員都具有相同的訪問控制。
引用C ++ 14(同樣適用於C ++ 11,但措辭更為間接),[class.mem] / 19:

如果標准布局類對象具有任何非靜態數據成員,則其地址與其第一個非靜態數據成員的地址相同。 否則,其地址與其第一個基類子對象的地址(如果有)相同。 [ 注意 :因此,在標准布局結構對象中可能存在未命名的填充,但不是在其開頭,以實現適當的對齊。 - 結束說明 ]

[類] / 7:

標准布局類是一個類:

  • 沒有非標准布局類(或此類類型的數組)或引用類型的非靜態數據成員,
  • 沒有虛函數(10.3),也沒有虛基類(10.1),
  • 對所有非靜態數據成員具有相同的訪問控制(第11條),
  • 沒有非標准布局基類,
  • 或者在最派生類中沒有非靜態數據成員,並且最多只有一個具有非靜態數據成員的基類,或者沒有具有非靜態數據成員的基類,並且
  • 沒有與第一個非靜態數據成員相同類型的基類。 110

110)這確保具有相同類類型並且屬於相同的最大派生對象的兩個子對象不被分配在同一地址(5.10)。

首先要做的事情是:C ++中的classstruct非常相似 - 唯一的區別是class中第一個訪問說明符之前的所有成員都被認為是私有的,而struct它們是公共的。

是否有保證,例如公共變量將首先在內存中,然后是私有變量?

沒有這樣的保證。 如果沒有繼承,則將按照在同一訪問組中聲明它們的順序將內存分配給類成員。 由編譯器決定是否應將公共成員變量置於私有/受保護變量之前,反之亦然。 與C一樣,C ++可以在類成員之間添加填充。

繼承使事情變得更復雜,因為基類的數據成員也需要放在派生類中。 最重要的是,存在虛擬繼承和多重繼承,具有復雜的規則。

我基本上想要實現相同的[布局],但我也想要get / set方法以及其他方法。

如果您將類的所有數據成員設為私有,並添加訪問器成員函數(這就是C ++從其他語言中調用“方法”),您將實現此效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM