字节对齐 、pragma 、位域长度问题整理
- 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
- 结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
- 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
#include <stdio.h>
struct stChar{
char a[5];
int b;
char c;
};
struct stShort{
char a;
short b;
};
struct stLong{
char a;
long b;
};
#pragma pack(8)
struct AA
{
int a;
char b;
short c;
char d;
};
struct AAA
{
int a:2;
char b:1;
};
int main()
{
struct stChar stChar1;
struct stShort stShort1;
struct stLong stLong1;
struct AA stAA;
struct AAA stAAA;
printf("stChar = [%ld]\n", sizeof(stChar1));
printf("stShort = [%ld]\n", sizeof(stShort1));
printf("stLong = [%ld]\n", sizeof(stLong1));
printf("stAA = [%ld]\n", sizeof(stAA));
printf("stAAA = [%ld]\n", sizeof(stAAA));
return 0;
}
打印结果
stChar = [16]
stShort = [4]
stLong = [16]
stAA = [12]
stAAA = [4]
|