struct和union在記憶體中占用空間大小的計算

2021-07-25 08:06:04 字數 1264 閱讀 5317

資料型別

32位系統

64位系統

_bool

1位元組1位元組

char

1位元組1位元組

short

2位元組2位元組

int4位元組

4位元組long

4位元組8位元組

long long

8位元組8位元組

float

4位元組4位元組

double

8位元組8位元組

long double

12位元組

16位元組

指標4位元組

8位元組enum

4位元組4位元組

在32位系統下,gcc的對齊方式為1,2,4,預設為4位元組對齊。

在64為系統下,gcc的對齊方式為1,2,4,8,預設為8位元組對齊。

union資料型別的大小計算方法是: 聯合體中占用記憶體空間最大的字段加上填充位元組後的和是聯合體中占用記憶體空間最大的字段的整數倍。(max+n) / x 的結果是乙個整數,result = max+n

max 是union中占用記憶體空間最大的字段占用的記憶體大小,大於等於1的整數。

n 是填充位元組,非負整數。

x 是union中占用記憶體空間最大的乙個基本資料型別占用的記憶體空間大小,大於等於1的整數。

result 是union資料型別實際上在記憶體中占用的記憶體大小,大於等於1。 一:

union a

;

這個聯合體占用12個位元組的記憶體空間。根據上面的計算公式計算是:(10+2)/4。

二:

struct z

;union c

;

這個聯合體占用的記憶體空間大小是:16個位元組。(16+0)/16

結構體中每個字段相對於結構體首位址的偏移量是這個欄位的資料型別占用的記憶體空間大小的整數倍,如果不是整數倍,那麼,在當前欄位前填充位元組,直到偏移量是本欄位資料型別占用記憶體空間大小的整數倍。

為了使記憶體對齊,結構體中所有字段占用記憶體空間位元組數要是本系統記憶體對齊數的整數倍,如果不是整數倍,那麼,在結構體最後乙個字段後面填充位元組,直到結構體占用的記憶體空間位元組數是系統記憶體對齊數的整數倍後,才是結構體實際占用的記憶體空間大小。 一:

struct v

;

結構體 struct v 占用空間的計算:

二:

struct r

;

結構體 struct r 占用空間的計算:

struct和union的記憶體分配

struct struct結構體在分配記憶體時需要遵循記憶體對齊規則 1.結構體的起始儲存位置必須是能夠被該結構體中最大的資料型別所整除 2.前面單元的大小必須是後面單元大小的整數倍 每個資料成員儲存的起始位址必須是自身大小的整數倍 如果不夠就補齊 3.整個結構體的大小 即sizeof的結果 必須是...

Union和struct的記憶體分配區別

今天看到有一段程式裡在struct裡面用了個union,然後就突然想到了struct和union的區別,找了些資料後發現,struct和union在記憶體分配的時候有區別,union裡的資料是公用一塊記憶體 所以給其分配的記憶體總是union裡面所定義的最大型別長度的整數倍。而struct裡的資料跟...

關於Union和Struct對齊

關於union,struct,還有機器數賦值,總是感覺自己認識不是特別深刻,這裡使用小demo程式加以說明,具體的詳細細節描述其它地方已經有說明和記錄,這裡不再說明。include union myun u int k a int main output size is 12 0 5 6 說明 in...