由於C 的專案做的少,又比較小,所以一直沒有註意位元組對齊的問題,但是,位元組對齊在大規模應用中對記憶體管理和CPU執行效率的影響應是挺大的。本文根據一些資料學習,做一個小總結。
先拋出第一個結論,位元組對齊可以提高CPU的執行效率。 (建議學習:phpstorm)
#CPU執行指令時從記憶體取得資料是按區塊操作的,區塊的大小可能為2-by
CPU執行指令時從記憶體取得資料是按區塊操作的,區塊的大小可能為2-bytes, 4-bytes 8 -bytes, 16-bytes……
此時,如果CPU讀取4-bytes或以上大小的資料的起始位址為1,則需要至少讀取2個資料區塊,然後再把2個區塊中不需要的資料拋棄,再將有用資料拼接成4-bytes的數據,這明顯增加了CPU的操作,影響了CPU指令的執行效率。如果CPU讀取資料的起始位址在0,4…,則一次只需讀取一個資料區塊,CPU的讀取指令就是一次原子操作。
另一個結論,位元組對齊有利於優化記憶體。
在結構體中,根據位元組自動對齊原則,結構體typedef struct _test { char a; int b; char c; } test;#器將採用結構體中位元組數最大的基本型別int的位元組數作為對齊標準,char類型將擴充為4-bytes,因此,sizeof(test)=12,但這樣的記憶體利用效率比較低。
如果透過指定編譯器1位元組對齊,則CPU的執行效率就會降低。
#praama pack(1) typedef struct _test { char a; int b; char c; } test; #pragma pack()為了確保CPU執行效率的條件下最佳化程式的內存,需要調整結構體中資料成員的順序
typedef struct _test { int b; char a; char c; } test;此時,結構體成員b佔用4個位元組,a和c分享後面的4個字節,其中兩個成員佔用前兩個字節,後兩個字節為字節對齊時填充的無效數據,此結構體佔用8個位元組的記憶體空間。 ###
以上是位元組對齊會影響記憶體存取的效率嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!