注:WIN32平台结构体对齐默认为32位,WIN32为64位,以下示例为WIN32平台。
1. typedef struct{
char a;double b;
char c;
}str1;
占用:8+8+8=24字节
2. typedef struct{
double b;char a;
char c;
}str2;
占用:8+8=16字节。后两个char对齐
3. #pragma pack(4)
typedef struct{
double b;char a;
char c;
}str3;
占用:(4+4)+4=12字节
(double分成两个4字节,两个char 组合成4字节)
转:
4.
typedef struct node3 { int a; short b; static int c; }str4; |
则sizeof(str4)=8.这里结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。其在内存中存储方式如下:
|--------int--------| 4字节
|--short-|----|----| 4字节
总结一下,在计算sizeof时主要注意一下几点:
1)若为空结构体,则只占1个字节的单元(C++)
2)若结构体中所有数据类型都相同,则其所占空间为 成员数据类型长度×成员个数
若结构体中数据类型不同,则取最长数据类型成员所占的空间为对齐标准,数据成员包含另一个结构体变量t的话,则取t中最 长数据类型与其他数据成员比较,取最长的作为对齐标准,但是t存放时看做一个单位存放,只需看其他成员即可。
3)若使用了#pragma pack(n)命令强制对齐标准,则取n和结构体中最长数据类型占的字节数两者之中的小者作为对齐标准。