sizeof在计算结构体大小的时候具体是怎样计算的
下面看一下sizeof在计算结构体大小的时候具体是怎样计算的
1.test1   空结构体
typedef struct node
{
}S;
则sizeof(S)=1;或sizeof(S)=0;
在C++中占1字节,而在C中占0字节。
2.test2
typedef struct node1
{
int a;
char b;
short c;
}S1;
则sizeof(S1)=8。这是因为结构体node1中最长的数据类型是int,占4个字节,因此以4字节对齐,则该结构体在内存中存放方式为
|--------int--------|   4字节
|char|----|--short-|   4字节
总共占8字节
结构体sizeof3.test3
typedef struct node2
{
char a;
int b;
short c;
}S2;
则siezof(S3)=12.最长数据类型为int,占4个字节。因此以4字节对齐,其在内存空间存放方式如下:
|char|----|----|----|  4字节
|--------int--------|  4字节
|--short--|----|----|  4字节
总共占12个字节
4.test4  含有静态数据成员
typedef struct node3
{
int a;
short b;
static int c;
}S3;
则sizeof(S3)=8.这里结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。其在内存中存储方式如下:
|--------int--------|   4字节
|--short-|----|----|    4字节
而变量c是单独存放在静态数据区的,因此用siezof计算其大小时没有将c所占的空间计算进来。
5.test5  结构体中含有结构体
typedef struct node4
{
bool a;
S1 s1;
short b;
}S4;
则sizeof(S4)=16。是因为s1占8字节,而s1中最长数据类型为int,占4个字节,bool类型1个
字节,short占2字节,因此以4字节对齐,则存储方式为
|-------bool--------|  4字节
|-------s1----------|  8字节
|-------short-------|  4字节
6.test6
typedef struct node5
{
bool a;
S1 s1;
double b;
int c;
}S5;
则sizeof(S5)=32。是因为s1占8字节,而s1中最长数据类型为int,占4字节,而double占8字节,因此以8字节对齐,则存放方式为:
|--------bool--------|    8字节
|---------s1---------|    8字节
|--------double------|    8字节
|----int----|---------|     8字节
7.test7
若在程序中使用了#pragma pack(n)命令强制以n字节对齐时,默认情况下n为8.
则比较n和结构体中最长数据类型所占的字节大小,取两者中小的一个作为对齐标准。
若需取消强制对齐方式,则可用命令#pragma pack()
如果在程序开头使用命令#pragma pack(4),对于下面的结构体
typedef struct node5
{
bool a;
S1 s1;
double b;
int c;
}S5;
则sizeof(S5)=24.因为强制以4字节对齐,而S5中最长数据类型为double,占8字节,因此以4字节对齐。在内存中存放方式为:
|-----------a--------|   4字节
|--------s1----------|   4字节
|--------s1----------|   4字节