5.2.2 共用体和结构的区别
代码5.4 共用体和结构的区别UnionAndStruct
<———————————文件名:example504.cpp————————————————> 01 #include<iostream> 02 struct comStruct//定义结构comStruct 03 { 04 char brand[10];//字符数组brand,表示品牌 05 float price;//float型变量price,表示价格 06 }; 07 union comUnion//定义共用体comUnion 08 { 09 char brand[10];//字符数组brand,表示品牌 10 float price;//float型变量price,表示价格 11 }; 12 int main() 13 { 14 using namespace std; 15 union comUnion com1;//声明一个共用体变量com1 16 comStruct com2;//声明一个结构变量com2 17 //共用体变量的成员占据相同的地址 18 cout<<"共用体com1.brand地址:"<<&com1.brand<<endl; 19 cout<<"共用体com1.price地址:"<<&com1.price<<endl; 20 //结构体变量成员占据不同的内存地址 21 cout<<"结构com2.brand地址:"<<&com2.brand<<endl; 22 cout<<"结构com2.price地址:"<<&com2.price<<endl; 23 return 0; 24 }
输出结果如下所示。
共用体com1.brand地址:0013FF74 共用体com1.price地址:0013FF74 结构com2.brand地址:0013FF64 结构com2.price地址:0013FF70
【代码解析】首先在main()函数外定义了一个结构类型comStruct和一个共用体类型comUnion,它们的存储数据列表是完全一样的,在main()函数内声明了comStruct型的结构变量com2。代码第15行,声明comUnion型的共用体变量com1,输出com1和com2的成员变量地址可以发现,对共用体来说,其成员变量开始于同一地址单元,也就是说,共用体中的成员变量占据同一块内存空间。com1和com2的内存模型如图5.1所示。
可以看出,在声明结构变量和共用体变量时,编译器的内存分配机制是不同的,对结构变量来说,编译器开辟一块连续的内存区域,为其中的每个数据成员分配相应大小的内存,但对于共用体变量来说,所有的数据成员起始于同一内存单元(示例代码5.4中com1.brand和com1.price都起始于0013FF74),也就是说所有的数据成员共用一块内存,这也是共用体名称的由来。
图 5.1 结构变量和共用体变量内存模型对比图
但是,在某一确定的时刻,共用体数据成员不能同时占有共用体内存空间,否则编译器无法分辨。编译器只按共用体中占内存最大的一个数据成员为共用体分配内存空间,在某个时刻,这个空间只能被一个成员所占有,在代码5.4中,com1中要么存储的是字符数组brand,要么存储float类型的变量price,但com1无法同时存储两者的信息。