【发布时间】:2011-06-05 23:37:35
【问题描述】:
我再次质疑一个长期存在的信念。
直到今天,我都认为下面这个结构体的对齐通常是4,大小通常是5...
struct example
{
int m_Assume_32_Bits;
char m_Assume_8_Bit_Bytes;
};
由于这个假设,我的数据结构代码使用 offsetof 来确定数组中两个相邻项之间的字节距离。今天,我发现一些旧代码在不应该使用 sizeof 的地方使用,不明白为什么我没有其中的错误,编写了一个单元测试 - 测试通过让我感到惊讶。
一些调查表明,我用于测试的类型的大小(类似于上面的结构)是对齐的精确倍数 - 即 8 个字节。它在最后一个成员之后有填充。这是一个示例,说明为什么我从未预料到会发生这种情况...
struct example2
{
example m_Example;
char m_Why_Cant_This_Be_At_Offset_6_Bytes;
};
一些谷歌搜索显示的示例清楚地表明允许在最终成员之后进行此填充 - 例如 http://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding(“或在结构的末尾”位)。
这有点尴尬,因为我最近发布了这条评论 - Use of struct padding(我对该答案的第一条评论)。
我似乎无法确定这种填充到对齐的精确倍数是否由 C++ 标准保证,或者它是否只是允许的并且某些(但可能不是全部)编译器会这样做。
那么 - 根据 C++ 标准,结构的大小是否必须是该结构对齐的精确倍数?
如果 C 标准做出不同的保证,我也对此感兴趣,但重点是 C++。
【问题讨论】:
-
是的,它是必需的。如果不是这样,您将无法对数组进行动态分配(使用 malloc)。
-
@Ben - +1 您在下面的中肯回答,但是,根据您的评论,如果您可以假设数组中的项目与结构中的相同类型字段填充相同(没有其他类型的成员),您可以将数组的每项填充大小计算为具有该类型的两个成员(仅此而已)的结构中第二个成员的偏移量。这就是我一直在做的错误。
标签: c++ struct alignment sizeof