熟悉結構體 結構體的記憶體對齊

2021-08-20 02:26:32 字數 948 閱讀 3788

結構的宣告注意問題。

結構體成員的訪問

結構變數的成員是通過點操作符(.)訪問的。

如果是結構體指標,則用(->)

結構體的自引用

struct node;
結構體內存對齊

為什麼要存在記憶體對齊?

1.平台問題(移植原因)

不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲異常。

2.效能原因

資料結果(尤其是棧)應該盡可能的在自然邊界上對齊。

原因在於:為了訪問未對其的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問只需要一次。

總之來說:結構體的記憶體對齊是拿空間換時間的做法。

為了既要滿足對齊,又要節省空間,應該讓占用空間小的成員集中在一起。

之前在逛部落格的時候看到很形象的案例,截圖留作筆記:

對齊規則:

vs中預設的值為8

linux中的預設值為4

結構體傳參問題

案例:

struct s

;struct s s = , 1000};

//結構體傳參

void print1(struct s s)

//結構體位址傳參

void print2(struct s* ps)

int main()

首選傳位址方式。在函式棧幀上分析,函式傳參的時候,引數是需要壓棧的。如果傳遞乙個結構體物件的時候,結構體過大,引數壓棧的系統開銷比較大,會導致效能下降。

了解一下位段

跟結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是位段不支援跨平台。

結構體對齊(記憶體對齊

有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 structt 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實踐出真知,在vc6中測試了下,答案確實8個位...

記憶體對齊 結構體對齊

現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 重要規則 1,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...

結構體的記憶體對齊

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