struct結構體內的對齊問題

2021-06-16 13:17:24 字數 1692 閱讀 1406

truct結構體由於包含了不同的資料型別,而資料結構型別之間存在占用空間大小的問題,比如char型占用1位元組,short int占用2位元組,int、long int、指標、float占用4位元組、double占用8位元組(windows和linux中)。但計算機系統對基本資料型別可能允許位址做出了限制,要求某種型別的物件必須是2、4或8的倍數(為了簡化處理器和儲存系統之間的硬體設計——可以節省至少1根位址線)。

我們對齊的規則是:每個成員按其型別的大小和指定對齊引數(這裡預設是8位元組)中較小的乙個對齊。並且結構的總長度必須為所用過的所有對齊引數的整數倍,不夠就補空位元組。

那麼對於給出的乙個struct型別資料,我們如何判斷它占用多少空間呢?

c++ struct記憶體分配大小  

一  原則:  

1 所有欄位在記憶體中出現順序與宣告順序一致 (理論上,譯器可以隨便放置各個字段)  

3 大多數編譯器會確保整個記錄的長度是2、4或者8個位元組的整數倍,他們通過在記錄的末尾新增補齊位元組以增加struct長度來做到這一點。編譯器之所以要補齊struct的大小,是為了要確保記錄的長度是記錄中的最大純量(scalar)物件大小或者cpu的最優對齊大小的整數倍。  

4 通常編譯器會提供乙個選項,讓你可以在全域性上禁止這一功能。很多編譯器還提供了pragma後者packed等關鍵字來讓你能夠逐struct地關掉字段對齊(優點是節省記憶體,缺點是增加了時間開銷)  

二 c++資料型別大小  

char       1byte  

short      2byte  

int        4byte  

long long  8byte  

string     32byte(空字串,stl建構函式暫且將其大小置為32byte)  

三 vs2008中struct大小遵循的原則:  

0 欄位在記憶體中出現順序與宣告順序一致(符合第1條)  

1 struct的長度是最長純量的整數倍(符合第3條)  

2 struct大小符合abi規則(符合第2條)  

四 例子  

string t;  

long long l;  

int i;  

char c;   

這個大小為48=32+8+4+4  

long long l;  

string t;  

int i;  

char c;  

這個大小為48=8+32+4+4  

int i;  

long long l;  

string t;  

char c;  

這個大小為56=8+8+32+8  

char c;  

short s;  

int i;  

long long l;  

string t;  

這個大小為 48=2+2+4+8+32  

short a;  

long long b;  

char c;  

short d;  

int e;  

short f;  

long long g;  

這個真實大小為 2+8+1+2+4+2+8   實際是8+8+2+2+4+8+8=40;  

五 reference  

《程式設計卓越之道 第一卷 深入理解計算機》randall hyde 張菲譯

struct 結構體內存對齊方式

以下都以32位機器為例分析結構體型別的變數在記憶體裡的儲存 一 1.結構體變數的儲存位置都是在記憶體中尋找位址是該變數自身大小整數倍開始儲存的。2.結構體型別變數的總大小應是該型別成員中最大資料型別的整數倍。就此兩點,可以解決所有問題,對於第一條,應該注意每一位成員存放的首位址定為自身的整數倍。例子...

結構體內存對齊問題

問題描述 結構體內存對齊問題值直接的體現就是計算結構體的sizeof占用的位元組數。結構體內存對齊的幾個原則,有了這幾個原則,不管結構體裡面是什麼元素,我們都能夠正確算出sizeof值 以vs2013為例 原則2 在原則1的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是,則...

結構體內存對齊問題

今天參加的c c 筆試,總的來說,感覺已經比以前好多了,相信是每天及時總結的緣故,廢話不多說,下面繼續堅持。今天大致做了三塊內容,首先計算機網路通訊,然後是資料結構部分,最後才是c c 的題目。前兩者另外再做小結,先就c c 1 記憶體對齊問題 對這個問題,以前我也總結過,一段時間沒有回看盡然有點忘...