首頁  >  文章  >  位元組對齊會影響記憶體存取的效率嗎

位元組對齊會影響記憶體存取的效率嗎

(*-*)浩
(*-*)浩原創
2019-12-26 09:27:175695瀏覽

由於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的讀取指令就是一次原子操作。

位元組對齊就是對CPU讀取的每一個數據,都保證其起始位址在資料區塊的起始端,對資料位元組數小於CPU資料區塊(粒度)的值進行擴充,使得其佔用完整的一個粒度的記憶體空間。位元組對齊,節省了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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn