clang++
表示该结构确实需要8个字节来表示自己,包括尾部3个填充字节。如果第二个结构中的char的偏移量为6,它将覆盖sizeof(example) == 8
使用的空间。某种类型的布局是实现定义的,并且应在整个实现中保持稳定。 再次,我在质疑一个长期的信念。
直到今天,我相信以下结构的对齐方式通常为4,大小通常为5 ...
struct example
{
int m_Assume_32_Bits;
char m_Assume_8_Bit_Bytes;
};
由于这种假设,我有一个数据结构代码,该数据结构代码使用offsetof来确定数组中两个相邻项之间的距离(以字节为单位)。今天,我发现一些旧代码在不应该使用sizeof的地方,无法理解为什么我没有bug,编写了单元测试-测试通过让我感到惊讶。
一点调查表明,我用于测试的类型的大小(类似于上面的结构)是对齐的精确倍数,即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 ++。
再次,我在质疑一个长期的信念。直到今天,我相信以下结构的对齐方式通常为4,大小通常为5 ...结构示例{int ...
[对齐的一个定义>大小:
[dcl.array]
节:应该
似乎C ++ 03标准没有说(或我没有找到)对齐填充字节是否应包含在对象表示中。
clang++
表示该结构确实需要8个字节来表示自己,包括尾部3个填充字节。如果第二个结构中的char的偏移量为6,它将覆盖sizeof(example) == 8
使用的空间。某种类型的布局是实现定义的,并且应在整个实现中保持稳定。 仍然,不确定m_Example
是否等于p+1
。我希望找到答案。