C、C++語言相關基礎鞏固 Round1 { 字節序、內存對齊 }

字節序

大小端

  • 大端(存儲)模式,是指數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址中,符合人類讀取模式,網絡字節序和PowerPc大多爲大端,總線的Motorola格式也是大端模式
  • 小端(存儲)模式,是指數據的低位保存在內存的低地址中,而數據的高位,保存在內存的高地址中,符合機器的讀取模式,嵌入式平臺多爲小端,總線的Intel格式也是小端模式

舉個例子,0x12345678在大小端中的佈局以下:
big_endian.gif數組

如何分別主機字節序

  • 因爲共用體是公用內存的,能夠使用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結構體 = 最大結構體成員的整數倍
  • 內存對齊的其餘狀況spa

    • 空類佔1字節
    • 數組是分開存儲的,能夠看做多個char
    • 虛表佔4字節
    • 虛繼承佔4字節
    • 靜態成員不佔空間
相關文章
相關標籤/搜索