在引用结构与变量时的对齐方式

时间:2017-02-20 10:11:37

标签: c++ memory

当我们谈论对齐时,我们总是指的是结构中的变量,而不是单个变量。

你可以告诉我为什么会这样吗? 当我们提到一个变量时,它会占用“单词”的整个大小吗?

2 个答案:

答案 0 :(得分:0)

最有可能的原因是,如果你搞乱了变量对齐,你要么处于低级优化的世界(基于缓存行估计和诸如此类的东西),要么进行一些嵌入式编程。

大多数开发人员都不这样做,那些做的人更有可能阅读他们的平台规格并重新考虑他们可能已经知道的对齐原则,而不是在互联网上讨论它(当然有例外,它不是一般趋势。

我还没有看到变量对齐,它不是以下的衍生物:

// the array "cacheline" will be aligned to 128-byte boundary
alignas(128) char cacheline[128];

另一方面,您不需要非常具体的情况来查看聚合(结构)对齐对程序的影响。

这是初学者在某些时候会写的和质疑的东西:

#include <iostream>

struct no_align
{
  char c;
  double d;
  int i;
};

struct align
{
  double d;
  int i;
  char c;
};

int     main(void)
{
  no_align      no_align_array[100];
  align         align_array[100];

  std::cout << sizeof(no_align_array) << std::endl;
  std::cout << sizeof(align_array) << std::endl;
}

在我的机器上,结果是:

2400 
1600

这就是你要在互联网上讨论为什么在世界上有一个版本会让你使用800个字节而不是另一个如果老师没有向你解释过这个字节的话。

答案 1 :(得分:0)

每种类型都有一个固定的大小和一个对齐要求。

结构体具有自己的对齐要求的成员。作为一个合乎逻辑的结果,结构必须具有至少与其所有成员的对齐要求一致的对齐要求。结构可能必须添加填充,以便其所有成员满足其对齐要求。

数组连续存储多个数组元素而不进行任何填充。作为一个逻辑结果,任何类型的大小必须是其对齐要求的倍数(因此包含int和char的结构不能具有四个字节的对齐要求和五个字节的大小,因为这不会为两个这样的结构的数组中的第二个数组元素工作)。

变量需要有地址才能满足它们的对齐要求,所以你的第一句话是错误的。

然而,有&#34; as-if&#34;规则:通常,编译器必须执行语言所说的内容。但是&#34; as-if&#34;规则说,只要程序找不到差异,编译器就可以做任何想做的事情。因此,如果在未对齐的地址上存储int没有区别(除非可能是一个很小的时间成本),编译器就可以这样做。