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
,它只减去四个字节。
启用优化后,将使用更智能的算法。
#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
,它只减去四个字节。
启用优化后,将使用更智能的算法。