字節序
大小端
- 大端(存儲)模式,是指數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址中,符合人類讀取模式,網絡字節序和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字節
- 靜態成員不佔空間