找了些资料后发现,struct和Union在内存分配的时候有区别,Union里的数据是公用一块内存……,所以给其分配的内存总是Union里面所定义的最大类型长度的整数倍。
而struct里的数据跟Union不一样,它们不共享一块内存,他是按照struct里面定义的数据顺序来进行分配内存的,但是分配的基本单位是struct里面所定义的最长的数据类型的长度。
举个形象的例子:
struct里面定义的数据类型的顺序为:
int a;
char b;
double c;
那个系统分配给这个struct的内存空间是多少呢?
应该是16!
为什么呢?因为系统先分配8个字节用来放int,结果int只需要4个就够了,然后剩下的4个中的一个可以用来放后面的char,碰到double c时,因为此时的3个字节不能存下,所以再分配了一个8个字节来存放double c
试想下如果struct里面定义的数据类型的顺序为:
int a;
double b;
char c;
那个系统分给这个struct的内存空间又是多少呢?
应该是24!
知道为什么的吧?系统碰到int分给他8个字节存放,碰到double时,剩下的4个字节不足以存放,所以再分配了8个字节,再遇到char c时又分配了8个字节,这样系统其实是浪费了5个字节的空间。
所以在结构体里面最好按照类型从小到大的顺序来……
#include <iostream>
using namespace std;
struct A1
{
char s;
double b;
};
struct A2
{
char s1;
double b;
char s;
};
struct A3
{
char s1;
char s3;
double b;
};
union B1
{
char a;
double b;
};
union B2
{
char a;
char a1;
double b;
};
union B3
{
char a;
double b;
char a1;
};
union B4
{
int a[5];
double b;
};
int main()
{
cout<<sizeof(A1)<<endl;
cout<<sizeof(A2)<<endl;
cout<<sizeof(A3)<<endl;
cout<<sizeof(B1)<<endl;
cout<<sizeof(B2)<<endl;
cout<<sizeof(B3)<<endl;
cout<<sizeof(B4)<<endl;
return 0;
}
运行结果为:
16
24
16
8
8
8
24
一个网上的好例子:http://blog.chinaunix.net/u2/84450/showart_1829958.html
可以使用联合体来发挥其长处。首先看一段代码:
{
struct { int x; int y; int z; }u;
int k;
}a;
int main()
{
a.u.x =4;
a.u.y =5;
a.u.z =6;
a.k = 0;
printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
return 0;
}
原文链接: https://www.cnblogs.com/luoyaoquan/archive/2011/05/04/2037080.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/24948
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!