编译器为了优化运行效率,对于结构体和类的成员访问会进行字节填充,即字节对齐。在这之前,我们需要知道如下基本信息:
1 C++中,类和结构体并没有本质的区别。只是默认的访问权限不同。
2 类和结构体的大小都是数据成员的大小,而不包括累成员函数的大小。
3 空的类或者空的结构体的大小都为1,而不是0。目前是编译器能够对其进行寻址定位。
字节对齐通常是已结构体中占用空间最大的一个成员进行对齐的。
typedef struct
{
char c; //占4个字节
int i; //4个字节
}TEST,*PTEST;
32位机上,该结构体的大小为8。
typedef struct
{
char c; //4
int i; //4
long long k; //8
}TEST,*PTEST;
32位机上,该结构体的大小为16字节。
typedef struct
{
char c; //8
long long k; //8
int i; //8
}TEST,*PTEST;
32位机上,该结构体的大小为24字节。
typedef struct
{
char c; //占用4个字节,以int对齐
int m; //占用4个字节,加上c的4个字节和k的8个字节对齐
long long k; //8
int i; //8 已k的8个字节对齐
}TEST,*PTEST;
32位机上,该结构体的大小为24字节。
1 C++中,类和结构体并没有本质的区别。只是默认的访问权限不同。
2 类和结构体的大小都是数据成员的大小,而不包括累成员函数的大小。
3 空的类或者空的结构体的大小都为1,而不是0。目前是编译器能够对其进行寻址定位。
字节对齐通常是已结构体中占用空间最大的一个成员进行对齐的。
typedef struct
{
char c; //占4个字节
int i; //4个字节
}TEST,*PTEST;
32位机上,该结构体的大小为8。
typedef struct
{
char c; //4
int i; //4
long long k; //8
}TEST,*PTEST;
32位机上,该结构体的大小为16字节。
typedef struct
{
char c; //8
long long k; //8
int i; //8
}TEST,*PTEST;
32位机上,该结构体的大小为24字节。
typedef struct
{
char c; //占用4个字节,以int对齐
int m; //占用4个字节,加上c的4个字节和k的8个字节对齐
long long k; //8
int i; //8 已k的8个字节对齐
}TEST,*PTEST;
32位机上,该结构体的大小为24字节。