zoukankan      html  css  js  c++  java
  • C/C++中的联合体

    C/C++中的联合体

    利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。


    当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:
    1)联合体是一个结构;
    2)它的所有成员相对于基地址的偏移量都为0;
    3)此结构空间要大到足够容纳最"宽"的成员;
    4)其对齐方式要适合其中所有的成员;

    演示代码如下:

    #include<iostream>
    using namespace std;
    
    union U1
    {
    	int n;
    	char s[11];
    	double d;
    };
    
    union U2
    {
    	int n;
    	char s[5];
    	double d;
    };
    
    int main()
    {
    	U1 u1;
    	U2 u2;
    	cout<<sizeof(u1)<<'	'<<sizeof(u2)<<endl;
    	cout<<"u1各数据地址:
    "<<&u1<<'	'<<&u1.d<<'	'<<&u1.s<<'	'<<&u1.n<<endl;
    	cout<<"u1各数据地址:
    "<<&u2<<'	'<<&u2.d<<'	'<<&u2.s<<'	'<<&u2.n<<endl;
    }
    上述代码中:

    对于U1联合体,s占11字节,n占4字节,d占8字节,因此其至少需1字节的空间。然而其实际大小并不是11,用运算符sizeof测试其大小为16。这是因为这里存在字节对齐的问题,11既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了。从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除。

    对于U2联合体,同理知道,用运算符sizeof测试其大小为8。


    具体运行结果如下:


    从结果图中还可以发现,联合体中的各数据的存储地址都是相同的。


    上面提到了联合体中的数据是共享相同的存储空间。下面再研究具体每种类型数值都存储在哪里?

    #include<iostream>
    using namespace std;
    
    union U
    {
    	unsigned int n;
    	unsigned char s[4];
    };
    
    int main()
    {
    	U u;
    	u.n = 0xf1f2f3f4;
    	cout<<hex<<u.n<<'	'<<&u.n<<endl;
    	cout<<hex<<(int)u.s[0]<<'	'<<(void*)&u.s[0]<<endl;
    	cout<<hex<<(int)u.s[1]<<'	'<<(void*)&u.s[1]<<endl;
    	cout<<hex<<(int)u.s[2]<<'	'<<(void*)&u.s[2]<<endl;
    	cout<<hex<<(int)u.s[3]<<'	'<<(void*)&u.s[3]<<endl;
    }

    上述代码中,联合体U中,n占4字节,s[4]也占4字节。故联合体共占4字节。

    程序输出如下:


    这说明,内存中数据低位字节存入低地址高位字节存入高地址,而数据的地址采用它的低地址来表示

  • 相关阅读:
    谢谢博客-园,让我不再有开源AYUI的想法
    [ay原创作品]用wpf写了个模仿36Kr网站登录背景的效果
    [AY技术分享]WPF AYUI的高大上日历代码
    [C#] AY.WPF-图形编程-高中生为起点-研究报告1
    [Aaronyang]谈谈2015年AY对WPF全面技术总结40多篇WPF,炫到没朋友的AYUI来了
    C#人爱学不学9[C#5.0异步实例+WPF自己的MVVM Async应用 1/12]
    Ay.Framework.WPF 2.0建立项目到底有多快
    [aaronyang]WPF4.5
    Hystrix是什么
    通俗理解ZooKeeper是如何保证数据一致性的
  • 原文地址:https://www.cnblogs.com/fengty90/p/3768840.html
Copyright © 2011-2022 走看看