#include<stdio.h>
struct A
{
char c;
double e;
int s;
}A;
int main()
{
printf("%u\n", sizeof(A));
return 0;
}
输出 16 。如果我们考虑结构内部填充和结构填充作为一个整体,不应该 24 吗?
我正在使用 GCC 4.8.2 编译 Ubuntu 14.04 32位上的代码。
答案 0 :(得分:12)
您的计算假设double
需要8字节对齐。所有架构都不是这样。
在具有GCC的32位x86 Linux上,double
默认为4字节对齐。您可以使用-malign-double
标志更改它,使其与8字节对齐。
因此布局假定默认为32位x86 Linux:
char // 1 byte
// 3 byte padding
double // 8 bytes
int // 4 bytes
总共16个字节,中间有3个字节的填充。
维基百科文章Data structure alignment在一些编译器/环境中的32位x86和64位x86_64上有各种类型的大小/对齐号。