【问题标题】:C++ Compiler Alignment - Just chars no paddingC++ 编译器对齐 - 只是字符没有填充
【发布时间】:2012-06-15 09:36:45
【问题描述】:

在VC++上,为什么编译器只在使用非char数据类型时才填充struct?

struct TEST
{
   char a[7];
};

struct TEST2
{
   __int32 a;
   char b[7];
};

sizeof(TEST); // Returns 7
sizeof(TEST2); // Returns 12

【问题讨论】:

  • 这完全是编译器特定的。你用什么编译器测试这个?

标签: c++ visual-c++ compiler-construction padding memory-alignment


【解决方案1】:

归根结底是sizeof(char) == 1 -- 总是这样。

数组必须是连续的,所以在一个 char 数组中(如果它足够大的话),你最终会得到每个可能对齐的元素。由于编译器/硬件必须 来完成这项工作,因此不能 需要插入填充来处理char 之类的struct

现在,这并不是说编译器不能插入填充。例如,即使使用 char 数组,它也可以通过这样做来提高性能。例如,给定您的 struct 定义,编译器完全可以接受将您的 7 个字符的数组再填充一个以使结构的大小为 8 —— 2 的漂亮、简洁的幂。

在某些硬件上,您可能会看到这一点。碰巧的是,VC++ 支持的 Intel 硬件并没有真正从这样的事情中受益,所以你不太可能在那里看到它。

【讨论】:

  • 这是有道理的。没有 char 数组(即char c1, c2, ...)也一样。
  • @Di-0xide:不是真的——两个单独定义的chars 不需要是连续的。但在数组中,它们必须是连续的(例如,如果数组中的第一个字符位于 xxxx0,则下一个必须位于 xxxx1)。
  • 哦,有趣-不,我指的是编译器执行的填充。至少在这种情况下,我收到了相同的测试结果。
  • @Di-0xide:看到同样的情况并不奇怪(尤其是在英特尔硬件上),但在这种情况下,如果需要,它可以在它们之间插入填充,而在一个不允许的数组。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2022-01-14
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多