c++ - 结构的大小是否需要是该结构对齐的精确倍数?

标签 c++ struct alignment sizeof

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

直到今天,我都认为下面这个struct的对齐方式通常是4,大小通常是5...

struct example
{
  int   m_Assume_32_Bits;
  char  m_Assume_8_Bit_Bytes;
};

由于这个假设,我的数据结构代码使用 offsetof 来确定数组中两个相邻项之间的字节距离。今天,我发现一些旧代码在不应该使用 sizeof 的地方使用了 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++。

最佳答案

5.3.3/2

When applied to a class, the result [of sizeof] is the number of bytes in an object of that class, including any padding required for placing objects of that type in an array.

所以是的,对象大小是其对齐方式的倍数。

关于c++ - 结构的大小是否需要是该结构对齐的精确倍数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4637774/

相关文章:

c++ - 有效地矢量化图像 block 处理?

C++ Clean String to int 转换

c - 使用 C 进行数字到字符串的映射

alignment - aarch64 上未对齐 SIMD 加载/存储的性能

css - 如何在不垂直对齐的情况下垂直对齐 td 单元格中的图像

c++ - 类中的 Typedef

c++ - 如何在 C++ 中使用 WMI 从 WIN32_NetworkAdapter 检索值?我无法理解查询后用于访问值的 VARIANT

c - 在 C 中的堆上分配结构

创建结构数组

css - Firefox 中的水平搜索按钮对齐方式