結構體大小計算與位域大小計算

2021-10-04 08:23:45 字數 2596 閱讀 8227

本博文純屬個人理解,有錯誤請多指正。

首先,各個變數所佔的位元組:

型別位元組(64位)

位元組(32位)

char11

unsigned char11

short22

unsigned short22

int4

4unsigned int44

long84

unsigned long84

float44

double88

指標84結構體計算大小原則

原則一、結構體中元素是按照定義順序乙個乙個放到記憶體中去的,但並不是緊密排列的。從結構體儲存的首位址開始,每乙個元素放置到記憶體中時,它都會認為記憶體是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始(以結構體變數首位址為0計算)。

原則二、經過原則一之後,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是,則結束;若不是,則補齊為它的整數倍。

結構體位域大小計算原則

1.如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止;

2.如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍;

3.如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮方式,dev-c++採取壓縮方式;

4.如果位域字段之間穿插著非位域字段,則不進行壓縮;

5. 整個結構體的總大小為最寬基本型別成員大小的整數倍。

本人對理論理解不是特別徹底,直接看例子對我來說更容易一點。

例子:

//由於存在對齊規則,a對b對齊,b為4個位元組,所以a佔4個位元組,4+4+8=16

struct x s1;

//1.同理,a對齊b,8+8+4=20,由於結構體計算大小原則二,結構體大小應為所有元素中最寬的元素長度的整數倍

是所有元素最寬的長度(8),結構體大小為24

struct x s2;

//8+4+4=16

struct x s3;

//8+4+4+4+4=24

struct x s5;

//8+8+4+4+1=25,補齊之後s6=32

struct x s6;

//4+4+8=16

struct x

;//8+16+24,a的大小應為x中元素最寬元素double c的倍數而不是16的倍數

struct y

;//4+1=5

struct tag0

__attribute

((packed));

//編譯器選項,不填充

//4+4=8

struct tag1

__attribute

((packed));

//4+4+8=16

struct tag2

__attribute

((packed));

//4+4+0=8

struct tag3

__attribute

((packed));

//4+4+1=9

struct tag4

__attribute

((packed));

//字太多分兩行看

佔1個位元組8位,由於b1只占用前5位,但是後三位不夠存放b2(b2要佔5位,剩餘的3位不夠用,根據位域大小計算原則2需要用新的儲存單元來放b2)

//2.所以b2存放在新的儲存空間,以此類推,8+8+8+8+8=5個位元組

typedef

struct aa aa;

佔4個位元組32位,由於b1只占用5位(0~4),根據位域大小計算原則1,b2緊臨b1儲存(5~9),以此類推,5+5+5+5+5=25

位只用了25位(相當於b1~b5存在了前25位,不到4個位元組)根據位域大小計算原則5,結構體的總大小應為最寬成員int(4個位元組)的整數倍

//3.所以結構體的大小為4個位元組

typedef

struct bb bb;

佔4個位元組32位,b1占用1位(0),空出兩位(1~2),b3占用3位(3~5),b4占用2位(5~6),b5占用3位(7~9)

5遇到型別不同的short b6,b6需要存在新的儲存單元,補齊之後b1和b3~b5佔4個位元組,b6占用4位(0~3),

遇到型別不同的int b7,b7需要存在新的儲存單元,補齊之後b6佔4個位元組(short佔4個位元組32位)

占用1位(0),補齊之後b7占用4個位元組,所以結構體大小為4+4+4=12個位元組

typedef

struct cc cc;

佔4個位元組32位,a占用29位,剩餘的3位不夠放b的29位,所以b存放在新的單元中,剩餘的3位不夠放c的4位

//2.所以b存放在新的單元中,所以4+4+4=12

struct test3

;//a占用27位,剩餘的5位不夠b存放,所以b存放在新的單元中,c占用4位放在b之後,所以4+4=8個位元組

struct test4

;

以上。

參考:

結構體大小計算

c語言 結構體大小計算 個人標籤啥東東封尾機 參考 一 結構體變數中成員的偏移量必須是成員大小的整數倍 0被認為是任何數的整數倍 eg typedef struct stu4 stu4 typedef struct stu5 stu4 這兩個結構體大小都為8 已驗證 二 結構體大小必須是所有成員大小...

結構體大小計算

結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 先介紹乙個相關的概念 偏移量。偏移量指的是結構體變數中成員的位...

結構體大小計算

結構體成員偏移量必須是成員大小的整數倍 結構體的大小必須是成員大小的整數倍 陣列,結構體除外 雖然浪費空間,但按照計算機的訪問規則,這種對齊方式,提高了效率 struct s1 int b 4float c 4double d 8 c pragma pack 4 指定向4對齊,而不是8 struct...