c sizeof 整数对齐?
c sizeof integer alignment?
您好,我知道 C 标准在执行 sizeof 时需要内存对齐。但是不太明白为什么连整型数组也需要对齐。请参阅我的以下示例:
#include <stdio.h>
struct flexarray {
int a[2];
double f;
};
int main(int argc, char** argv)
{
printf("sizeof (struct flexarray) = %zu\n", sizeof (struct flexarray));
return 0;
}
输出为 16,因为 sizeof(int)
= 4 且 sizeof(double)
= 8。没关系。
但是当我将 a 更改为 int[3]
时,输出为 24 这不是我所期望的,因为根据我的计算结果应该是 20 (= 3 x 4 + 8)。
我能想到的唯一解释是编译器添加了一个填充整数,但我不明白为什么会这样:sizeof(int[3])
是 12,毕竟它是 4 字节的倍数。
我正在使用 gcc 在 32 位 Linux 上编译。
Linux 93c9e1096795 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
有人能告诉我为什么吗?
如果你使用offsetof
检查class成员的位置,你可能会发现编译器希望double
值在8字节上对齐边界。
您好,我知道 C 标准在执行 sizeof 时需要内存对齐。但是不太明白为什么连整型数组也需要对齐。请参阅我的以下示例:
#include <stdio.h>
struct flexarray {
int a[2];
double f;
};
int main(int argc, char** argv)
{
printf("sizeof (struct flexarray) = %zu\n", sizeof (struct flexarray));
return 0;
}
输出为 16,因为 sizeof(int)
= 4 且 sizeof(double)
= 8。没关系。
但是当我将 a 更改为 int[3]
时,输出为 24 这不是我所期望的,因为根据我的计算结果应该是 20 (= 3 x 4 + 8)。
我能想到的唯一解释是编译器添加了一个填充整数,但我不明白为什么会这样:sizeof(int[3])
是 12,毕竟它是 4 字节的倍数。
我正在使用 gcc 在 32 位 Linux 上编译。
Linux 93c9e1096795 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
有人能告诉我为什么吗?
如果你使用offsetof
检查class成员的位置,你可能会发现编译器希望double
值在8字节上对齐边界。