資料型別
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...