今天在调试代码时,关于struct与union内存分配问题产生了疑惑,故上网查询了相关资料,记于此,以便日后查看。
struct与union在内存分配的时候,主要区别如下:
前者按照结构体内定义的数据顺序来进行分配内存的,分配的基本单位(即:每分配一次的量)是struct里面所定义的最长数据类型的长度;后者联合体内的数据共用一块内存,是以union里面所定义的最大类型长度的整数倍来分配内存的。
定义之类的东东总是让人感到枯燥乏味,举个形象的例子,有一个struct类型变量定义如下:
struct {
int a;
char b;
double c;
}demo;
那么系统分配给demo结构体的内存空间是多大呢?
答案是16!为什么呢?因为系统先分配8个字节用来放int,结果int只需要4个就够了,然后剩下的4个中的一个可以用来放后面的char,碰到double c时,因为此时的3个字节不能存下,所以再分配了一个8个字节来存放double c。
试想一下,如果这个struct类型变量其内存定义的变量顺序改变成如下所示:
struct {
int a;
double b;
char c;
}demo;
那个系统分给这个struct的内存空间又是多少呢?
应该是24!知道为什么的吧?系统碰到int分给他8个字节存放,碰到double时,剩下的4个字节不足以存放,所以再分配了8个字节,再遇到char c时又分配了8个字节,这样系统其实是浪费了5个字节的空间。所以在结构体里面最好按照类型从小到大的顺序来。
一个简单的测试例子:
#include <stdio.h>
struct S1 {
char c;
double b;
};
struct S2 {
char c1;
double b;
char c2;
};
struct S3 {
char c1;
char c2;
double b;
};
union U1 {
char c;
double b;
};
union U2 {
char c1;
double b;
char c2;
};
union U3 {
char c1;
char c2;
double b;
};
union U4 {
int a[5];
double b;
};
int main()
{
printf("sizeof(S1) = %d\n", sizeof(S1));
printf("sizeof(S2) =%d\n", sizeof(S2));
printf("sizeof(S3) =%d\n", sizeof(S3));
printf("sizeof(U1) = %d\n", sizeof(U1));
printf("sizeof(U2) = %d\n", sizeof(U2));
printf("sizeof(U3) = %d\n", sizeof(U3));
printf("sizeof(U4) = %d\n", sizeof(U4));
return 0;
}
/**
* 运行结果:
* sizeof(S1) = 16
* sizeof(S2) = 24
* sizeof(S3) = 16
* sizeof(U1) = 8
* sizeof(U2) = 8
* sizeof(U3) = 8
* sizeof(U4) = 24
*/