C、C++语言相关基础巩固 Round1 { 字节序、内存对齐 }

字节序

大小端

  • 大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中,符合人类读取模式,网络字节序和PowerPc大多为大端,总线的Motorola格式也是大端模式
  • 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中,符合机器的读取模式,嵌入式平台多为小端,总线的Intel格式也是小端模式

举个例子,0x12345678在大小端中的布局如下:
C、C++语言相关基础巩固 Round1 { 字节序、内存对齐 }_第1张图片

如何分别主机字节序

  • 由于共用体是公用内存的,可以使用union来判断
    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 ? 小端 : 大端

字节序的翻转

  • htons、htonl、ntohs、ntohl
#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结构体 = 最大结构体成员的整数倍
  • 内存对齐的其他情况

    • 空类占1字节
    • 数组是分开存储的,可以看作多个char
    • 虚表占4字节
    • 虚继承占4字节
    • 静态成员不占空间

你可能感兴趣的:(c++)