字节序
大小端
- 大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中,符合人类读取模式,网络字节序和PowerPc大多为大端,总线的Motorola格式也是大端模式
- 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中,符合机器的读取模式,嵌入式平台多为小端,总线的Intel格式也是小端模式
举个例子,0x12345678在大小端中的布局以下:
数组
如何分别主机字节序
union X { int a;char b; } x;
x.a = 0x01000000; // 以a的内存布局做为参考
return num.b == 0x01 ? 大端 : 小端
int a = 1;
char c = *(char*)(&a);
return c == 1 ? 小端 : 大端
字节序的翻转
#define RERSERSE_16(x) ( ((x)&0xff)<<8) | (((x)&0xff00)>>8 )
#define REVERSE_32(x) ( ((x)&0xff000000)>>24 | ((x)&0xff0000)>>8 | ((x)&0xff00)<<8 | ((x)&0xff)<<24)
内存对齐
-
内存对齐的意义网络
- 编译器对内存/IO是按照块进行存取的,采用内存对齐的方式能够提升CPU读取数据的效率
- 为了知足特定硬件
-
内存对齐的3个规则布局
- 第一个数据要放在偏移0的地方,后面的数据根据最大成员长度整除的地址开始存储
- 若是有结构体成员,结构体要从结构体中最大成员的整数倍地址开始存储
- sizeof结构体 = 最大结构体成员的整数倍
-
内存对齐的其余状况spa
- 空类占1字节
- 数组是分开存储的,能够看做多个char
- 虚表占4字节
- 虚继承占4字节
- 静态成员不占空间