結構體中記憶體對齊問題

2021-07-12 01:09:50 字數 986 閱讀 7775

首先,在記憶體分配上,如果是單獨的乙個資料型別,對齊方式如下:

常用型別的對齊方式

型別 對齊方式(變數存放的起始位址相對於結構的起始位址的偏移量)

char 偏移量必須為sizeof(char)即1的倍數

int 偏移量必須為sizeof(int)即4的倍數

double 偏移量必須為sizeof(double)即8的倍數

short 偏移量必須為sizeof(short)即2的倍數

float 偏移量必須為sizeof(float)即4的倍數

比如:如果是乙個char型別陣列,每乙個元素相對於起始位址的偏移量應該是1、2、3…..

如果是乙個int型別陣列,每乙個元素相對於起始位址的偏移量應該是4、8、12、16…..

那麼,問題來了,如果不是乙個陣列而是乙個結構體,這個結構體中包含了不同型別的資料,比如:

struct mystruct

;

這個結構體中包含了三個不同型別的變數,那麼在同一塊連續的記憶體空間上,如果單獨的為其中的某個變數分配空間,無論有多少個同型別的變數,那將是很容易的,只要根據單個變數的對齊規則,按先後順序以及規定的偏移量順序分配記憶體空間豈可。但是現在這個結構體中有三個不同型別的變數,這三個變數的其實位址都是這個結構體的起始位址,但是要按照他們各自的對齊規則將他們順序的放到一條連續的記憶體空間上並且不能產生重疊干涉,這就是結構體內存對其的問題了。

首先doub作為第乙個變數,對齊規則是8、16、32、、由於前面沒有變數,位址空間空閒,那麼他的記憶體位址為1-8.

第二個變數ch為char型別,對齊規則為1、2、3、、、由於前面的0-8已經被占用,那麼它的起始位址自動轉到9.那麼他的記憶體位址就為9-9.

第三個變數i為int型,對齊規則為4、8、12、、、、由於前面的1-8已經被doub占用了,9-12這段記憶體中的9也被ch占用了,那麼i只能選擇13-16這段記憶體空間了,10-12就被空閒了。

這就是結構體中的記憶體對其。

結構體對齊(記憶體對齊

有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 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,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...

結構體的記憶體對齊問題

在c c 筆試中,記憶體對齊問題經常考,儘管這樣,這幾年來我一直忽略了這個問題,記憶中一直是大學課本中struct與union的區別,那時候也不曾有提及過記憶體對齊,現在想起來,真是非常大的漏洞。而且很多筆試想當然的覺得struct的大小就是內部所有變數大小的和,卻不知這種錯誤的答案讓多少面試官默默...