c語言記憶體對齊與 pragma pack n

2022-09-12 18:24:10 字數 696 閱讀 6399

一、什麼是記憶體對齊,為什麼要記憶體對齊 

上圖說明的是cpu如何與記憶體進行資料交換的模型,左邊是cpu,右邊是記憶體空間,記憶體上邊的0~3是記憶體位址。這張圖以32位cpu作為代表。

32位cpu是以雙字為單位進行資料傳輸的,正因為這個原因,如果我們的資料只有8位或16位,cpu是不是就會以我們資料的位數進行傳輸呢,答案是否定的,這樣會使的cpu硬體變得複雜,所以32位cpu傳輸資料無論是8位或是16位都是以雙字進行傳輸的。

比如乙個int型別的4位元組資料如果放在上圖記憶體位址1開始的地方,那麼這個資料占用的記憶體位址為1~4,那麼這個資料就被分成了2部分,一部分在0~3位址上,一部分在4~7位址上。又因為32位cpu以雙字傳輸,所以cpu會分兩次進行讀取,一次先讀取0~3位址上的內容,再一次讀取4~7位址上的資料。最後cpu提取並組合出正確的int型別資料。捨棄掉無關資料。

如果把這個int型別資料存放在從位址0開始的地方,cpu只需要一次讀取就可以得到這個int資料型別了。這次cpu只用了乙個週期就得到了資料,可見記憶體擺放很重要,合理的記憶體對齊可以減少cpu的使用資源

二、記憶體對齊規則

三、#pragma pack()自定義資料對齊規則

#pragma pack(push),#pragma pack(pop),#pragmapack()

#pragma pack(push,1)  作用:將原來的對齊方式設定為壓棧,並設定新的對齊方式為1個位元組對齊方式。

C語言 記憶體對齊

寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?講講位元組對齊吧.分割線 如果體系結構是不對齊的,a中的成員將會乙個挨乙個儲存,從而sizeof a 為11。顯然對齊更浪費了空間。那麼為什麼要使用對齊呢?體 繫結構...

c語言記憶體對齊

記錄平常所學,以便回顧。c語言中存在著記憶體對齊問題,在struct儲存中尤為明顯,這裡先介紹一種情況,以後接著補充。typedef unsigned char u8 typedef unsigned short u16 typedef unsigned long u32 typedef unsig...

C語言記憶體對齊

一.記憶體對齊的初步講解 記憶體對齊可以用一句話來概括 資料項只能儲存在位址是資料項大小的整數倍的記憶體位置上 例如int型別占用4個位元組,位址只能在0,4,8等位置上。include struct xx int main 執行結果如下 a ffbff5ec b ffbff5e8 c ffbff5...