c++ union内存

看一个例子:

#include <iostream>
#include <stdio.h>
using namespace std;

union A {
    int a;
    struct {
        short b;
        short c;
    };
};

int main()
{
    A s;
    s.a = 0x12345678;

    printf("%x %x", s.b, s.c);
    return 0;
}

输出结果:

5678 1234

为什么是这样的呢?

因为A是union,所以在内存中存储的格式为:

高地址         ------------>    低地址

12     34    56    78

00010010 00110100   01010110   01111000

s.b 占据低地址的两个字节

s.c 占据高地址的两个字节

所以:

s.b = 5678

s.c = 1234

为了证明,以及看的更清楚,看下面这个程序。

#include <iostream>
#include <stdio.h>
using namespace std;

union A {
    int a;
    struct {
        short b;
        short c;
    };
};

int main()
{
    A s;
    s.a = 0x12345678;
    printf("b = %x ; c = %x\n", s.b, s.c);
    printf("&a = %x ; &b = %x; &c = %x\n", &s.a, &s.b, &s.c);
    return 0;
}

结果:

b = 5678 ; c = 1234
&a = 28ff1c ; &b = 28ff1c; &c = 28ff1e

是不是很明显了。

时间: 2024-10-20 12:01:17

c++ union内存的相关文章

【转】C/C++ struct/class/union内存对齐

原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括stru

C/C++ struct/class/union内存对齐

struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon. 2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"

Union函数

. 共用体声明和共用体变量定义 共用体(参考“共用体”百科词条)是一种特殊形式的变量,使用关键字union来定义 共用体(有些人也叫"联合")声明和共用体变量定义与结构体十分相似.其形式为: union 共用体名{ 数据类型 成员名; 数据类型 成员名; ... } 变量名; 共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量.在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值. 下例表示声明一个共用体foo: uni

C#实现union以及lock的使用

1.什么是Union类型数据 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的.每个数据成员都在相同的内存地址开始. 分配给联合的存储区数量是“要包含它最大的数据成员”所需的内存数.同一时刻只有一个成员可以被赋给一个值. C++中表达Union类型数据 union TokenValue { char _cval; int _ival; double _dval; }; 2.Union类型数据的内存使用情况 Union类型数据的分配是以最大的成员变量为准,也就是说上

联合体union的详解

1.概述 联合体union的定义方式与结构体一样,但是二者有根本区别. 在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和.而在"联合"中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度. 2.联合体长度 在The C Programming Language里面讲述union内存分配的原话是 1)联合体就是一个结构 2)联合体的所有成员相对于基地址的偏移量为0 3)此结构空间要大到总够容纳最"宽"的成员 4)并且,其对其方式要适

C/C++中的内存对齐 C/C++中的内存对齐

一.什么是内存对齐.为什么需要内存对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 字,双字,和四字在自然边界上不需要在内存中对齐.(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址.)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能

C++内存对齐方式

转自http://www.blogfshare.com/memory-alignment.html 一.什么是内存对齐.为什么需要内存对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 字,双字,和四字在自然边界上不需要在内存中对齐.(对字,双字,和四字来说,自然边界分别是偶数地址,可以

lua.5.2.3源码阅读(03):通用变量

lua的堆栈中存放的是通用变量,通用变量实际上就是一个union内存块,根据不同的类型,采用不同的组织方式, 看一下通用类型的相关定义,截取了lobject.h相关代码,从代码上看,不太清楚numfield为什么会有两个相关定义. 堆栈中可以根据情况分为一下几种类型: 1.双精度浮点数:double d__; 2.复合类型,通过tt__来表示类型: 3.复合类型中分为两种:可回收类型和不可回收类型: 4.可回收类型可以是:TString.Udata.Closure.Table.Proto.UpV

union的内存分布

union w {    int a;  char b; } c; Union的大小为其内部所有变量的最大值,并且按照类型最大值的整数倍进行内存对齐. 上述w,按int,4字节对齐.因此sizeof(w) = 4. union w {    int a;  char b[10]; double c; } c; 上述w,按double,8字节对齐.因此sizeof(w) =  10 + 6(对齐) = 16.