2017-11-25 106 views
1

以下代碼可交叉編譯內存對齊保證

struct Foo { 
    alignas(1) char c1; 
    alignas(1) char c2; 
    alignas(4) int i; 
}; 
static_assert(sizeof(Foo) == (sizeof(int) + 4), "No cross-compilable"); 

換句話說,是保證sizeof(Foo) == (sizeof(int) + 4)不管什麼架構/平臺?

+0

嚴格來說?我會說不。我不相信對齊規範否定了填充選項。 – StoryTeller

+0

@StoryTeller我考慮到了'+ 4'(就是填充「+ 2」)。 –

+1

是的,就是這樣。填充沒有綁定,真的。不可能超過您指定的數量,但不是真正的約束。 – StoryTeller

回答

2

不能保證。這將在今天的許多體系結構上工作,但在具有8字節int(在8字節邊界上對齊)的系統上這不起作用。在這種情況下,你應該得到一個編譯器診斷,因爲你試圖對int應用一個不太嚴格的對齊;看[dcl.align]。

+0

請問您能否提供更多關於爲什麼在「8字節int arch」上無效的細節? –

+0

@BiagioFesta如果一個'int'有8個字節的對齊,那麼'Foo'中'i'的偏移量將是8,並且sizeof(Foo)將是16. – 1201ProgramAlarm

+0

你是對的!那麼'alignof(int)+ sizeof(int)== sizeof(Foo)'會是正確的嗎? (注意:'int'的'alignas(4)'被刪除) –