C 中奇怪的对齐行为

Weird alignment behaviour in C

#include <stdio.h>

int main(void)
{
  int a = 0x4565;
  long ch1;
  int ch2;

  printf("%p %p %p\n", &ch2, &ch1, &a);
  printf("%zu %zu %zu\n", sizeof(long), sizeof (int), _Alignof(a));

  return 0;
}

输出:

0x7fffebb487dc 0x7fffebb487e0 0x7fffebb487ec
8 4 4

如果 int 的对齐方式是 4 那么为什么 space 变量没有分配到 0x7fffebb487e8 中?

为什么编译器给出额外的 4 字节 space(填充)?

只有当 int 分配在大小为 8 的变量(如指针、long、long long)之后才会发生这种情况。

如果前面的变量是 int 类型,即大小为 4 且对齐为 4,则编译器不提供填充。

我很困惑。请帮助我。

谢谢。

如果不进行优化,编译器会天真地分配 space 并从高地址到低地址处理堆栈,这是堆栈增长的方向。

从以 0(十六进制)结尾的对齐地址开始,它为 a 分配四个字节,将其放在以 C 结尾的地址。然后,对于 long ch1,它必须跳过四个字节才能到达以 0 结尾的 eight-byte-aligned 地址。最后,对于 ch2,它只减去四个字节。

启用优化后,将使用更智能的算法。