由於c++的專案做的少,又比較小,所以一直沒有注意位元組對齊的問題,但是,位元組對齊在大規模應用中對記憶體管理和cpu執行效率的影響應是挺大的。本文根據一些資料學習,做乙個小總結。
cpu執行指令時從記憶體中獲取資料是按塊操作的,塊的大小可能為2-bytes, 4-bytes, 8-bytes, 16-bytes……
此時,如果cpu讀取4-bytes或以上大小的資料的起始位址為1,則需要至少讀取2個資料塊,然後把2個塊中不需要的資料拋棄,再將有用資料拼接成4-bytes的資料,這明顯增加了cpu的操作,影響了cpu指令的執行效率。如果cpu讀取資料的起始位址在0,4……,則一次只需要讀乙個資料塊,cpu的讀取指令就是一次原子操作。
位元組對齊就是對cpu讀取的每乙個資料,都保證其起始位址在資料塊的始端,對資料位元組數小於cpu資料塊(粒度)的值進行擴充,使得其占用完整的乙個粒度的記憶體空間。位元組對齊,節省了cpu進行資料擷取和拼接的操作。
另乙個結論,位元組對齊有利於優化記憶體。
在結構體中,根據位元組自動對齊原則,結構體typedef struct _test test;
編譯器將採用結構體中位元組數最大的基本型別int的位元組數作為對齊標準,char型別將擴充為4-bytes,因此,sizeof(test)=12,但是這樣的記憶體利用效率比較低。
如果通過指定編譯器1位元組對齊,則cpu的執行效率就會降低。#praama pack(1)
typedef struct _test test;
#pragma pack()
為了保證cpu執行效率的條件下優化程式的記憶體,需要調整結構體中資料成員的順序typedef struct _test test;
此時,結構體成員b占用4個位元組,a和c分享後面的4個位元組,其中兩個成員占用前兩個位元組,後兩個位元組為位元組對齊時填充的無效資料,此結構體占用8個位元組的記憶體空間。
mysql位元組對齊 C 位元組對齊彙總
一 什麼是位元組對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。二 位元組對齊的原因和...
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...