内存对齐保证
以下代码可交叉编译?内存对齐保证
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