结构的大小是否必须为该结构的对齐方式的精确倍数?

问题描述 投票:18回答:9

再次,我在质疑一个长期的信念。

直到今天,我相信以下结构的对齐方式通常为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 ...

c++ struct alignment sizeof
9个回答
10
投票

[对齐的一个定义>大小:


17
投票
5.3.3 / 2

6
投票
标准说([dcl.array]节:

3
投票
我不确定这是否符合实际的C / C ++标准,我倾向于说这取决于编译器(只是出于安全考虑)。但是,我度过了“有趣”的时光,几个月前,我不得不在网络上作为协议的一部分在网络上以字节数组形式发送动态生成的C结构,以与芯片进行通信。所有结构的对齐方式和大小必须与芯片上运行的代码中的结构一致,该芯片是使用MCC架构的GCC变体编译的。我将尝试给出该​​算法,并且它

应该


1
投票
因此将您的问题分成两个部分:

1
投票
C ++没有明确说明,但这是其他两个要求的结果:

1
投票

0
投票

似乎C ++ 03标准没有说(或我没有找到)对齐填充字节是否应包含在对象表示中。

C99标准说结构类型或联合类型的“ sizeof”包括内部填充和尾随填充,但是我不确定该“跟踪填充”中是否包含所有对齐填充。
现在回到您的示例。确实没有混乱。 clang++表示该结构确实需要8个字节来表示自己,包括尾部3个填充字节。如果第二个结构中的char的偏移量为6,它将覆盖sizeof(example) == 8使用的空间。某种类型的布局是实现定义的,并且应在整个实现中保持稳定。

仍然,不确定m_Example是否等于p+1。我希望找到答案。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.