Struct 和 Union区别
Posted 胡育诚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struct 和 Union区别相关的知识,希望对你有一定的参考价值。
题目1:
有如下结构体
struct A
long a1;
short a2;
int a3;
int *a4;
;
请问在64位编译器下用sizeof(struct A)计算出的大小是多少?
内存对齐
成员对齐有一个重要的条件,即每个成员按自己的方式对齐。
其对齐的规则是:每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐。并且结构的长度必须为所用过的所有对齐参数的整数倍。不够就补空字节,这里结构的长度必须是short的整数倍
32位与64位字节有变化是只有指针变量、long、unsigned long:
32位 64位
-------------------------------------------
指针变量 4 8
long 4 8
unsigned long 4 8
下面每个小方框代表一个字节:(有下划线表示有内容,没有下划线表示会被自动补充)
口口口口 口口口口 // long a1: 占满了第一行8个字节
口口 口口口口 口口 // short a2 占了第二行前两个字节,紧接着int a3 顺序占了第二行第3~6这四个字节,第7、8个字节由系统自动补齐;
口口口口 口口口口 // int *a4: 占满了第三行8个字节
因此:总共3*8 = 24个字节
题目2:
请问输入结果可能是哪些?
如果按照大端模式存储:从低地址到高地址:20 15 08 10
输出从低地址到高地址:20 15 08 10
如果按照小端模式存储:从低地址到高地址:10 08 15 20
输出从高地址到低地址:08 10 20 15
大端模式
是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前32位应该这样读: e6 84 6c 4e ( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相反
小端模式
所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前32位应该这样读: 4e 6c 84 e6( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相同
Struct 和 Union
1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息。
2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在。
3.对于Union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct 的不同成员赋值 是互不影响的。
struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间。那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:
struct sTest
int a; //sizeof(int) = 4
char b; //sizeof(char) = 1
shot c; //sizeof(shot) = 2
x;
所以在内存中至少占用 4+1+2 = 7 byte。然而实际中占用的内存并不是7 byte,这就涉及到了字节对齐方式。
union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给union的内存size 由类型最大的元素 size 来确定,如下的内存就为一个double 类型 size :
union uTest
int a; //sizeof(int) = 4
double b; //sizeof(double) = 8
char c; //sizeof(char) = 1
x;
所以分配的内存 size 就是8 byte。
既然是内存共享,理所当然地,它不能同时存放多个成员的值,而只能存放其中的一个值,就是最后赋予它的值,如:
x.a = 3; x.b = 4.5; x.c = ‘A’;
这样你只看到x.c = ‘A’,而其它已经被覆盖掉,失去了意义。
参考:http://blog.csdn.net/firefly_2002/article/details/7954458
以上是关于Struct 和 Union区别的主要内容,如果未能解决你的问题,请参考以下文章