(改寫)結構在記憶體中的儲存分配 對齊原則

2021-07-13 14:35:00 字數 1934 閱讀 2253

知識點

1:結構在記憶體中的儲存分配

--對齊原則

首先,我們應該知道:編譯器對變數進行儲存分配時,滿足以下優化原則:

n位元組元素首位址需要能夠被

n整除。該原則稱為對齊原則。

現闡述結構體成員的記憶體分配規律:

從結構體的首位址開始,向後依次為每個成員尋找乙個滿足條件的首位址

x,該條件為:

x%n=0(

n為各個成員的對齊引數)。結構體的首位址選取也滿足該條件,此時

n為結構體的對齊引數。關於結構體中成員對齊參 數:

n=min(sizeof(成員型別

),n),其中

n為編譯器中可設定的結構體成員對齊引數(

1,2,4,8,16位元組等)。整個結構體的對齊引數為

該結構體中成員的最大的對齊引數。另外,結構體的長度應為成員變數中最大對齊引數的最小整數倍(要至少足以容納所有的變

量)。舉例說明:

#include#pragma pack(8) //設定編譯器中結構體成員對齊引數為8

struct example1

;struct example2

;#pragma pack()

int main(int argc, char* argv)

;

當編譯器對齊引數設為

8byte時,則該結構體的長度為

24個位元組。

2.當結構體中有成員不是乙個完整的型別單元,而是位段時:

(位段:

c語言允許在乙個結構體中以位為單位指定其成員所佔記憶體長度,這種以位為單位的成員成為「位段」或「位域」。利用位段能夠用較少的位數儲存資料。)

對於位段成員,首先按其型別分配空間,如

int型就分配

4個連續的儲存單元。接下來,若是相同型別的位段成員就連續存放,公用這

4個儲存單元,當該型別長度不夠用時,就

另起乙個該型別長度的儲存空間。其它分配原則不變。

eg:(

intel筆試)

#include「stdafx.h」

#include struct bit

int main(int argc,char *argv)

;str str1;

str1在記憶體中的空間分配示意圖如下:

str1在記憶體中實際表示則為:

分配過程:先定義的

a(2個位),被分配到高

16位的低位上,緊接著是

b(3個位),後面的成員分配依此類推。最後的

int型,因為是

16位,高

16位剩餘的

7個位不能容納它,

則i被分配到低

16位。

2.如果乙個位段要從下乙個位元組開始存放,可採用如下定義:

struct str

它在記憶體中對應結構如下:

另外,關於位段要知道:

一、可以定義無名位段如

unsigned :3;但該長度的空間是不可用的。

二、不能夠定義位段陣列。

三、給位段賦值時,遵循自動階段原則。即當某個位段長度為

2位時,卻被賦值為

5,則要進行截斷。

如:struct bit中有

unsigned a:2;令

bit.a=5;則此時

a的值應該為等於

1.  

結構體內存分配對齊策略

win32 平台下的微軟 c編譯器 cl.exe for 80 86 的對齊策略 1 結構體變數的首位址是其最長基本型別成員的整數倍 備註 編譯器在給結構體開闢空間時,首先找到結構體中最寬的基本資料型別,然後尋找記憶體位址能是該基本資料型別的整倍的位置,作為結構體的首位址。將這個最寬的基本資料型別的...

結構體在記憶體中對齊

剛剛完成乙個檔案的遷移程式,其中遇到了結構體對齊的問題,所以拿出來說說,與各位博友們分享。我的程式很簡單,就是把之前通過乙個結構體 fwrite 到檔案 a 裡的內容讀出,然後轉給另乙個結構體儲存。程式是簡單,但我擔心的是之前把結構體 fwrite 到檔案 a 的程式對齊結構體規則是怎樣的?一定要知...

結構體在記憶體中的對齊規則

結構體在記憶體中的對齊規則 標籤 儲存 struct 測試iostream c2011 11 15 19 32 4717人閱讀 9 收藏 舉報乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include using namespace std struct x c...