关于“结构体所占空间大小的运算”这里有篇比较好的文章:
http://blog.csdn.net/haihuanjack/article/details/7911068
在C/C++中我们常常会看到有求一个结构体的大小的情况,有时候我们就会想:不就是结构体中各个数据类型所占的空间加起来就行啦,那么事实上是不是这样呢?答案:不是滴。原因是:为了加快读写数据的速度,编译器就实现了数据对其的做法来为每一个结构体分配空间。
这里我只讲结构体中数据对其的一个要点:2倍。
2倍(本人自己总结的)是指有两个倍数要记住,第一就是结构中的各类型的倍数,第二就是结构体这个类型的倍数。
那么具体怎么理解这两个倍数呢?举个例子就好理解了。如
struct A
{
char a;
double b;
int c;
};
(说明:在VS中char占有1个字节,double占了8个字节,int占了4个字节)
计算的时候是这样子的:首先是按照自上向下为结构体分配空间,并在其之间作调整。首先为char分配一个空间,接着编译器为了实现数据的对其,所以在分配double的时候会对之前所分配的空间进行一些调整,调整方式是按照原先分配的空间的大小和当前要分配的大小来决定将要分配的空间,因为double为8字节,所以编译器要求在double之前所分配的空间大小应该是当期要分配的空间的倍数,在这里也就是说在double前面分配的应该是8的倍数空间才行,所以原来的char被迫扩展到8个字节,然后才为double分配8个字节,这样这两个变量就占了16字节。接着就是到了int了,因为int需要4个字节,而前面所分配的为16个字节,是4的倍数,所以接着就为int分配了4个字节,也就是到了目前编译器为这个结构体分配了20个字节,那么是否就是这个答案呢?哈哈,你试一下就知道这个答案不正确,因为这只是其中的一个倍数(按照我所说的两个倍数中的一个),那么还有一个倍数是什么呢?其实还有一个就是前面所说的对结构体整体的一个倍数处理,已经为结构体分配好20个字节空间,那么接下来就是编译器要求整个结构体所分配的空间大小是结构体中占用空间最多的类型所占用空间大小的倍数,如上面的例子,结构体中占用空间最多的就是double这种了类型,那么就要求结构体总大小是这个类型的倍数,在这里也就是要求结构体所占用空间大小要是8 的倍数,因为20不是8的倍数,所以结构体被迫扩展自己的空间,以满足需要,所以就扩展到24个字节。所以结果为24.不知道你学会了没有,如果有什么不同的见解,不如在下面回复一下,不胜感激。
现在我们讨论复杂一点的
第一种:
struct teacher
{
char name[3];
};
struct student
{
long num;
char name[10];
char sex;
int age;
char sex2;
double score;
struct teacher t1;
};
student:40个字节
第二种:
struct teacher
{
char name[9];//9+7(为了与student中的double补齐)
};
struct student
{
long num;//4
char name[10];//10
char sex;//1+1
int age;//4
char sex2;//1+3
double score;//8
struct teacher t1;
};
student:48个字节
第三种:
struct teacher
{
char name[9];//9+3
int age;//4
char gender;//1+7(为了与student中的double补齐)
};
struct student
{
long num;//4
char name[10];//10
char sex;//1+1
int age;//4
char sex2;//1+3
double score;//8
struct teacher t1;
};
student:56个字节
http://blog.csdn.net/haihuanjack/article/details/7911068
在C/C++中我们常常会看到有求一个结构体的大小的情况,有时候我们就会想:不就是结构体中各个数据类型所占的空间加起来就行啦,那么事实上是不是这样呢?答案:不是滴。原因是:为了加快读写数据的速度,编译器就实现了数据对其的做法来为每一个结构体分配空间。
这里我只讲结构体中数据对其的一个要点:2倍。
2倍(本人自己总结的)是指有两个倍数要记住,第一就是结构中的各类型的倍数,第二就是结构体这个类型的倍数。
那么具体怎么理解这两个倍数呢?举个例子就好理解了。如
struct A
{
char a;
double b;
int c;
};
(说明:在VS中char占有1个字节,double占了8个字节,int占了4个字节)
计算的时候是这样子的:首先是按照自上向下为结构体分配空间,并在其之间作调整。首先为char分配一个空间,接着编译器为了实现数据的对其,所以在分配double的时候会对之前所分配的空间进行一些调整,调整方式是按照原先分配的空间的大小和当前要分配的大小来决定将要分配的空间,因为double为8字节,所以编译器要求在double之前所分配的空间大小应该是当期要分配的空间的倍数,在这里也就是说在double前面分配的应该是8的倍数空间才行,所以原来的char被迫扩展到8个字节,然后才为double分配8个字节,这样这两个变量就占了16字节。接着就是到了int了,因为int需要4个字节,而前面所分配的为16个字节,是4的倍数,所以接着就为int分配了4个字节,也就是到了目前编译器为这个结构体分配了20个字节,那么是否就是这个答案呢?哈哈,你试一下就知道这个答案不正确,因为这只是其中的一个倍数(按照我所说的两个倍数中的一个),那么还有一个倍数是什么呢?其实还有一个就是前面所说的对结构体整体的一个倍数处理,已经为结构体分配好20个字节空间,那么接下来就是编译器要求整个结构体所分配的空间大小是结构体中占用空间最多的类型所占用空间大小的倍数,如上面的例子,结构体中占用空间最多的就是double这种了类型,那么就要求结构体总大小是这个类型的倍数,在这里也就是要求结构体所占用空间大小要是8 的倍数,因为20不是8的倍数,所以结构体被迫扩展自己的空间,以满足需要,所以就扩展到24个字节。所以结果为24.不知道你学会了没有,如果有什么不同的见解,不如在下面回复一下,不胜感激。
现在我们讨论复杂一点的
第一种:
struct teacher
{
char name[3];
};
struct student
{
long num;
char name[10];
char sex;
int age;
char sex2;
double score;
struct teacher t1;
};
student:40个字节
第二种:
struct teacher
{
char name[9];//9+7(为了与student中的double补齐)
};
struct student
{
long num;//4
char name[10];//10
char sex;//1+1
int age;//4
char sex2;//1+3
double score;//8
struct teacher t1;
};
student:48个字节
第三种:
struct teacher
{
char name[9];//9+3
int age;//4
char gender;//1+7(为了与student中的double补齐)
};
struct student
{
long num;//4
char name[10];//10
char sex;//1+1
int age;//4
char sex2;//1+3
double score;//8
struct teacher t1;
};
student:56个字节