簡體   English   中英

struct alignment C / C ++

[英]struct alignment C/C++

在c / c ++中(我假設它們在這方面是相同的),如果我有以下內容:

struct S {
  T a;
  .
  .
  .
} s;

以下是否保證是真的?

(void*)&s == (void*)&s.a;

或者換句話說,是否有任何保證第一個成員之前沒有填充?

在C中,是的,它們是相同的地址。 簡單明了。


在C ++中,不,它們不是同一個地址。 基類可以(我懷疑,確實)來到所有成員之前,而虛擬成員函數通常會將隱藏數據添加到某個地方的結構中。 更令人困惑的是,C ++編譯器也可以隨意重新排列成員,除非該類是標准布局類型(雖然我不知道任何編譯器都這樣做)

最后,如果C ++結構由標准布局類型組成,不包含基類和虛函數,並且所有成員都具有相同的可見性,並且可能還有其他我忘記的限制, 那么它將依賴於C規則,並且需要第一個成員與對象本身位於同一地址。

§9.2/ 7

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

§9.2/ 20

指向標准布局結構對象的指針(使用reinterpret_cast進行適當轉換)指向其初始成員(或者如果該成員是位字段,則指向它所在的單元),反之亦然。 [注意:因此,在標准布局結構對象中可能存在未命名的填充,但不是在其開頭,以實現適當的對齊。 - 尾注]

是的。

保證在C和C ++中的第一個結構成員之前沒有填充(如果它是POD)。

C報價:

(C11,6.7.2.1p15)“結構對象中可能有未命名的填充,但不是在它的開頭。”

C ++引用:

(C ++ 11,9.2p20)“因此,在標准布局結構對象中可能存在未命名的填充,但在開始時可能沒有,以實現適當的對齊”

暫無
暫無

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

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