C語言結構體的記憶體對齊

2021-07-26 12:39:15 字數 1400 閱讀 4495

學過c語言的大家應該都學到過結構體,結構體是一種聚合資料型別,它可以把不同型別的資料儲存在一起,我們把結構體中儲存的資料叫做結構體成員。

了解了結構體後,我們來談一談結構體在計算機系統中是如何儲存的,首先,我們來看看下面這段**:

struct a

;int main()

這段**中我們分別定義了三個結構體成員,按順序分別是char型別,int型別和char型別。在main函式中我們定義了結構體變數a,並分別用printf列印了各個結構體成員的大小和結構體的大小,結果如下:

看到結果後我們思考乙個問題?為什麼三個結構體成員的大小加起來不等於結構體的總大小呢,要弄明白這個問題,就需要我們理解計算機中是如何儲存結構體的了。

原則一:結構體中元素是按照定義順序乙個乙個放到記憶體中去的,但並不是緊密排列的。從結構體儲存的首位址開始,每乙個元素放置到記憶體中時,它都會認為記憶體是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始(以結構體變數首位址為0計算)。

現在我們通過原則一來看一看上面**中所定義的結構體中的成員是如何在計算機系統中儲存的。

關於結構體成員的偏移量我們可以通過offsetof巨集來計算,它被定義在stddef.h標頭檔案中。下面我們來計算一下上面**中的結構體各個成員的偏移量:

下面我們來介紹一下第二個原則

原則二在經過第一原則分析後,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是,則結束;若不是,則補齊為它的整數倍。

第二個原則是為了避免當我們定義結構體陣列時,可能會出現訪問乙個成員時要訪問兩塊記憶體的情況,所以,編譯器會把沒有達到結構體最大位元組的整數倍的記憶體浪費掉。

記憶體對齊是一種消耗空間來換取時間的做法,沒有記憶體對其我們可能訪問乙個成員變數需要對兩塊記憶體進行訪問,這時非常影響效率的,而當有了記憶體對齊後,雖然我們是浪費掉一些記憶體空間,但我們訪問乙個成員變數只需要訪問一塊記憶體(每次訪問最大的成員變數的記憶體)。另外,記憶體對齊還簡化了形成處理器和記憶體系統之間介面的硬體設計。

C語言結構體對齊 記憶體對齊問題

c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?有人給對齊原則做過總結,具體在 看到現在已記不起來,這裡引用一下前人...

C語言結構體之記憶體對齊

首先看乙個例子,下面有乙個結構體 struct structtest1 假設這個結構體成員在記憶體中是緊湊排列的,那麼c1的儲存位址就是0,s的儲存位址是1 2,c2的儲存位址是3,i的儲存位址是4 7,c1的位址是0000000000000000,s的位址是0000000000000001,c2的...

解析C語言結構體對齊 記憶體對齊問題

c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?有人給對齊原則做過總結,具體在 看到現在已記不起來,這裡引用一下前人...