为什么struct的大小不等于其各个成员类型的大小总和?

cla*_*aws 3 c compiler-construction visual-c++

可能重复:
为什么structof sizeof不等于每个成员的sizeof之和?

我想之前必须提出类似(重复)的问题.但是我找不到它们.基本上我不知道要搜索什么.所以在这里问一下.

为什么struct的大小不等于其各个成员类型的大小总和?我正在使用visual C++编译器.

例如,假设32位机器.{=> sizeof(int)== 4; sizeof(char)== 1; sizeof(短)== 2; }

  struct {
      int k;
      char c;
  } s;
Run Code Online (Sandbox Code Playgroud)

预期的大小是4 + 1 = 5; 但sizeof(s)给出8.这里char占用4个字节而不是1.我不知道确切原因,但我的猜测是编译器这样做是为了提高效率.

struct{
 long long k;
 int i;
} s;
Run Code Online (Sandbox Code Playgroud)

预期大小为4 + 4 = 8(在32位机器上)和8 + 4 = 12(在64位机器上).但奇怪的是sizeof(s)给出16.这里int和long long每个占用8个字节.

  1. 这叫什么东西?
  2. 到底发生了什么?
  3. 为什么编译器会这样做?
  4. 有没有办法告诉编译器停止这样做?

Ama*_*9MF 6

这是因为编译器使用填充将每个元素转换为特定于您要编译的体系结构的字对齐.

它可能是出于以下几个原因之一,但通常是:

  1. 因为某些CPU 在不在其自身大小的地址倍数时,根本无法读取长或长的多字节值.

  2. 因为可以读取非对齐数据的CPU可能比对齐更慢.

您通常可以使用特定于编译器的指令或pragma强制关闭它.

执行此操作时,编译器将生成相对低效的代码,以使用多个读/写操作访问非对齐数据.