首先要提到匯流排寬度這個概念,我們平常提到的32位處理器、64位處理器,就是指的匯流排寬度為32、64位,也就是在乙個處理器訪問週期中訪問的資料位數。對於某些處理器多位元組訪問必須從偶數位元組開始,如果從奇數字址取乙個short整形數(兩位元組)將會導致異常,而對於另外一些處理器,即使多位元組的訪問可以從任意位元組開始,但是訪問未對齊的資料時會需要額外的時間開銷。所以如果乙個變數的記憶體位址正好是它長度的整數倍,就稱為自然對齊,此時訪問效率最高。例如對於乙個32位型別的資料,如果它在記憶體中的位址剛好可以被4整除(也就是最低兩位為0),那麼它就是自然對齊的。因此對於乙個大小為2n位元組型別的資料,它位址的最低有效位後n位都應該是0。
每乙個c的型別都有自然邊界:如果某種型別資料位址是n的整數倍時訪問效率最高,那麼n就是該型別的自然邊界。
n = min(匯流排寬度,資料型別大小)
下面列出了資料型別的大小和其自然邊界值:
對於非壓縮的結構體,在記憶體中的布局遵循以下兩個原則。
例如下面的結構體宣告:
struct ******
;struct ****** vect[2];
struct outer
;struct point
;
每個字母表示乙個位元組,*表示乙個填充位元組。
16位匯流排中的記憶體布局:
struct ******
struct ****** vect[2] }
struct outer }
struct pointer
32位匯流排中的記憶體布局:
struct ******
struct ****** vect[2] }
struct outer }
struct pointer
64位匯流排中的記憶體布局:
struct ******
struct ****** vect[2] }
struct outer }
struct pointer
在gnu c中有乙個特色就是__attribute__(前後是兩個下劃線)機制。_attribute_
可以設定函式屬性、變數屬性和型別屬性。這裡主要講它的變數屬性設定。
該屬性規定變數或結構體成員的最小的對齊格式,以位元組為單位。如:
int x __attribute__ ((aligned (16))) = 0;
編譯器將以16位元組對齊的方式分配變數。也可以對結構體成員變數設定該屬性,如
struct foo
;
可以手動指定對齊的格式,如果aligned後面沒有數值,則編譯器將根據實際情況選擇最有益的對齊方式。
使用該屬性可以使得變數或者結構體使用最小的對齊方式,即乙個位元組的對齊方式,忽略所有填充位元組。
struct exam
'
整數邊界對齊方式 嵌入式基礎 位元組對齊
一 記憶體訪問對齊規則 從高階語言的視角看,記憶體訪問是是位元組為單位的。但是從cpu角度看,記憶體訪問粒度與指令有關,比如1位元組訪問,2位元組訪問,4位元組訪問,8位元組訪問等。如果在程式設計過程中不注意記憶體對齊,可能引發一系列問題 1,非對齊訪問需要硬體修正。比如讀取4位元組資料,如果從4位...
嵌入式mysql資料
關於嵌入式mysql開發資料很少,有幾篇帖子只說自己編譯通過了,卻不說說關鍵的步驟。還是mysql的工程師厚道,給出了嵌入式mysql開發的ptt 根據ppt上詳細的介紹,你還會找到鏈結這是作者寫的乙個win32 dialog 嵌入式mysql 的demo,相當的給力。準備bd.cmd 和 errm...
非嵌入式與嵌入式的區別
非嵌入式是通過軟體控制硬體,軟硬體之間直接聯絡來實現要求。但是一旦硬體發生改變軟體也要改變,為了降低這種偶合度過高的問題,出現了嵌入式。嵌入式在軟體和硬體之間新增了作業系統,軟體通過控制作業系統進而控制硬體,硬體發生改變並不會導致軟體也發生改變,這為軟體開發人員節約了很多時間,並且嵌入式能在已有的硬...