【发布时间】:2018-03-09 12:09:58
【问题描述】:
对于任何对象类型T,是否总是sizeof(T) 至少与alignof(T) 一样大?
直觉上似乎是这样,因为即使您调整对象的对齐方式,例如:
struct small {
char c;
};
在正常情况下,它们的“大小”也会向上调整,以便数组中对象之间的关系在保持对齐的同时有意义(至少在我的testing 中。例如:
struct alignas(16) small16 {
char c;
};
大小和对齐方式均为 16。
【问题讨论】:
-
@tadman - 真正适用于任何架构。我在问标准保证或暗示什么。显然,在这两个示例中,
sizeof(分别为 12 和 I*200)大于 alignof(分别为 1 和 I),其中 I 是 sizeof(I)。 -
@tadman - 这不是关于 x86 处理器的问题。当你说“这些将是一样的”时,“这些”是什么?
-
好吧,如果您从假设开始,例如“
float是 4 个字节,sizeof( float )返回 4,但系统架构要求float位于 8 字节边界上” ,这会导致什么?副手,我认为这意味着float的数组将被破坏。 -
@tadman 当然不是
sizeof(T) == alignof(T)的情况。很容易证明,例如struct S { char a,b; };通常有大小 2 和 alignof 1。我的问题是关于>=而不是==虽然...... -
... 所以在硬件级别你可能有一些奇怪的东西,比如需要 16 字节对齐的 10 字节值,从 C++ 的角度来看,我认为这必须只是 sizeof 16。这就是为什么我要向@tadman 提供一个平台示例,其中 sizeof(long double) 小于 alignof(long double) - 因为这似乎不可能成为一个合规的实现!
标签: c++ c++11 memory-alignment alignof