記憶體對齊問題的理解

2021-06-01 00:30:12 字數 950 閱讀 7219

解決效率問題:1。為什麼會出現這種問題 2。解決的途徑是什麼3。用例子來說話

如果下面的幾個例子,你能正確給出答案:請不必再看!!

#pragma pack(1)//用來定義記憶體對齊所佔位元組

struct test

;#pragma pack()//這個取消操作

#pragma pack(2)

struct test

;#pragma pack()

#pragma pack(4)

struct test

;#pragma pack()

答案分別為:14,16,24--------

#pragma pack(4)

struct test

;#pragma pack()

struct test

;這兩個所佔記憶體大小分別為:12,16------知道為什麼嗎?如果沒有加上#pragma pack(4),那就按最大型別的倍數來算。但是話又說回來,加不加對於乙個32位處理器的cpu來說,不都一樣嗎???不加也應該按照4個位元組來算才對呀!!-----這裡我還是有點暈,如果***話,講評價一下

為什麼需要記憶體對齊??

因為cpu看待資料和我們不一樣::

以上是人們的角度:

以上是cpu的角度

讀資料時如果是從0位元組開始讀取時,直接讀取4個位元組即可,唯讀一次

讀資料如果是從1開始:所要做的工作是:此時cpu先訪問一次記憶體,讀取0-3個位元組的資料進暫存器,並再次讀取4-5個位元組的資料進暫存器,接著把0位元組和5,6,7位元組的資料刪除,最後全並1,2,3,4,位元組的資料進暫存器。

cpu是按塊讀取的,假如我們想讀取2-7這些位元組,不能人為的想想像我們直接讀吧-2,3,4,5,6,7。但是cpu是另一種思維,它只能按塊讀取時,雖然要讀取234,便是真正在讀時會擴充,一下讀4個位元組。

關於記憶體對齊的理解

關於記憶體對齊的理解 就是說,記憶體不是一次性以8位 即 1位元組 被 cpu讀取的,有可能是2,4,8,16位元組,這稱為記憶體粒度,你讀寫資料的時候,如果跨兩個記憶體粒度讀寫資料,而且,你讀寫資料又不是從第乙個記憶體粒度的首位址開始的,這樣速度會有問題。為什麼,道理很簡單,cpu要進行一系列的資...

記憶體對齊的問題

記憶體對齊問題是每乙個c程式設計師都應該考慮過的問題,c編譯器的規則明確規定了對齊問題,就是乙個struct中按照最長的型別對齊,比如考慮下面的結構體 struct abc char a int b char c 在32位x86機器上它的大小是多少呢?是12,為什麼呢?因為該結構體中最長的型別是in...

記憶體對齊的問題

記憶體對齊問題是每乙個c程式設計師都應該考慮過的問題,c編譯器的規則明確規定了對齊問題,就是乙個struct中按照最長的型別對齊,比如考慮下面的結構體 struct abc 在32位x86機器上它的大小是多少呢?是12,為什麼呢?因為該結構體中最長的型別是int,因此需要按照4位元組對齊,因此a和c...