2017-11-25 155 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)'被删除) –