一 内存对齐问题
先看一个面试题(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;
| |