以下代碼可交叉編譯?內存對齊保證
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)
不管什麼架構/平臺?
以下代碼可交叉編譯?內存對齊保證
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)
不管什麼架構/平臺?
不能保證。這將在今天的許多體系結構上工作,但在具有8字節int
(在8字節邊界上對齊)的系統上這不起作用。在這種情況下,你應該得到一個編譯器診斷,因爲你試圖對int
應用一個不太嚴格的對齊;看[dcl.align]。
請問您能否提供更多關於爲什麼在「8字節int arch」上無效的細節? –
@BiagioFesta如果一個'int'有8個字節的對齊,那麼'Foo'中'i'的偏移量將是8,並且sizeof(Foo)將是16. – 1201ProgramAlarm
你是對的!那麼'alignof(int)+ sizeof(int)== sizeof(Foo)'會是正確的嗎? (注意:'int'的'alignas(4)'被刪除) –
嚴格來說?我會說不。我不相信對齊規範否定了填充選項。 – StoryTeller
@StoryTeller我考慮到了'+ 4'(就是填充「+ 2」)。 –
是的,就是這樣。填充沒有綁定,真的。不可能超過您指定的數量,但不是真正的約束。 – StoryTeller