首頁 > 常見問題 > 位元組對齊會影響記憶體存取的效率嗎

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

(*-*)浩
發布: 2019-12-26 09:27:17
原創
5764 人瀏覽過

由於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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板