内存对齐及大小端

一  内存对齐问题

先看一个面试题(c++): 

union  s{
 long  a;    

char c[5];    

int szData[5];
 double d;
};

 

struct  b

{

long  a;

union  s;

}

求sizeof(union s) ?   //24

    sizeof(struct b) ?   //32

有几个问题需要回答,内存对齐的规则是什么? 这个union 对象在内存中数据是怎么排列的? 大端小端都一样吗?

 

1) 内存对齐的规则

     1. 结构体或联合在内存中,第一个数据的位置为offset为0的位置. 其他每个数据都放在该成员最小集整数倍位置。 如char[5]  放在1的整数倍的位置(而不是5)。

     2. 如果结构体嵌套了结构体,则需要从该结构体最大元素的整数倍开始存储。

     3.结构体的总大小为最大成员(如果是数组,则只取一个就可以了)的总数倍。

 

二  关于大小端

再看另外一个面试题(这个大家应该都看过):

#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266  ??

 

2) 大小端问题

现在大多数系统都是小端的,跟CPU类型有关。

如果是小端模式,则内存的存放规则是“低位低地址,高位高地址”:

16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 0x4000 0x4001
存放内容 0x34 0x12

而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0x4000 0x4001
存放内容 0x12 0x34

 

下面来看下union在大小端如何处理的?

union AU{

    int a;

    char b;

};

union AU A;

A.a = 1;

 

小端场景下,按照“低位低地址,高位高地址”原则:

地址A
------------------------------------
|A       |A+1   |A+2    |A+3 | int a;
|0x01 |0x00   |0x00   |0x00 |
-------------------------------------
|A      |char b;
|          |

 

大端:

------------------------------------
|A       |A+1   |A+2    |A+3 | int a;
|0x00 |0x00   |0x00   |0x01|
-------------------------------------
|A      |char b;
|          |

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值