小議結構體中的大小

2021-09-22 04:58:37 字數 1814 閱讀 7708

一、c語言中結構體的大小計算

當乙個結構體中的所有成員都是同一型別的,其大小當然好計算。下面主要討論成員型別不一樣的情況結構體大小的計算。

對此,聽說編譯器有兩條規則:

1、結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍)

2、結構體大小必須是所有成員大小的整數倍。

似乎有些難理解。

在32位的作業系統下(記憶體字長為4位元組)做下面的練習:

struct stu1

sizeof(stu1)

=12bytes;

struct stu2

;struct stu3

;sizeof(stu2)=sizeof(stu2)=8bytes

struct stu4

ss;int k;};

sizeof(stu4)

=16;

上面這些都可以且容易理解。再看下面一例:

struct pack_ucmd

brcast_cmd;

} u;

uint8_t type;

uint8_t unuse;

uint16_t datalen;

uint8_t data[1];}

這個大小是多少?sizeof(pack_ucmd)=14

介紹乙個相關的概念——偏移量。偏移量指的是結構體變數中成員的位址和結構體變數位址的差。結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。

依次將這個結構體展開。由於32位系統字長4個位元組,為了避免產生過多的記憶體碎片,像char char int16會放在乙個字長內;而char int32就要分兩個字長記憶體存放了。

上面聯合體的大小根據其成員中大者data[6]=6bytes而定。更深入者,自己理解。

二、物件導向中的結構體的大小:

注    意!c#中呼叫指標時,要在工程屬性中選擇[允許不安全**],還要在**中的指標部分使用unsafe括起來。

結構體的大小

對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各個硬體平台對儲存空間的處...

結構體的大小

typedef 定義型別 typedef unsigned long long uint64 定義型別,起外號 例如 typedef struct student student 注意 typedef int pfun int,int 函式指標 指向函式的指標 typedef int pint de...

結構體的大小

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