結構本身和結構成員在記憶體中儲存的形式

2022-07-08 00:12:23 字數 2481 閱讀 3236

結構中不同成員的儲存形式並不是像想像中那樣,乙個接著乙個的分配記憶體空間。如某些機器的整型變數的長度是4個位元組,同時它需要起始儲存位置能夠被4整除。

如下**:

#include#include

struct

ddata1;

struct

fdata2;

structe;

intmain()

view code

size of struct d:120

size of

struct f:104

size of

struct f:8

struct

d:

char a: 0

int b: 4

char c: 8

float d: 12

char e: 16

double f: 24

char g: 32

int h[20]: 36

h[0]: 36

h[1]: 40

h[19]: 112

structf:

double f: 0

float d: 8

int b: 12

int h[20]: 16

h[0]: 16

h[1]: 20

h[19]: 92

char a: 96

char c: 97

char e: 98

char g: 99

--------------------------------process exited after

0.03223 seconds with return value 14

請按任意鍵繼續. . .

view code

struct d 的記憶體分配形式(假定初始位置為100這裡用0代替以此類推)

(黑色填充的代表被占用,白色的代表是空閒的)

通過這個**可以看出結構成員如何分配記憶體的。

它們在結果所分配的時候從初始位置為零算起,必須能被它們在記憶體中所佔的位元組數整除,如 int 在佔位元組數是4的機器中就要求必須能夠被4整除,double 所佔位元組為8位的話,那麼就要能被8整除,如果前乙個成員的緊接著的記憶體不滿足這個條件,那麼就把不符合的位置空出來,起到對齊的效果。同時從整個結構來看,如果整個結構中只有 char 型別那麼結構所佔的位元組數就和成員個數相同,如果在結構中有 double 那麼結構的最後必須能夠被 double 所佔的位元組數整除(這裡認為它是8),如果沒有 只有 int ,float 等4位元組的型別,那麼結構所佔位元組就必須能夠被4整數。

#include#include

structe;

intmain()

size of struct e:24

16--------------------------------

process exited after 0.03793 seconds with return value 2

請按任意鍵繼續. . .

#include#include

structe;

intmain()

size of struct e:3

--------------------------------

process exited after 0.01826 seconds with return value 19

請按任意鍵繼續. . .

#include#include

structe;

intmain()

size of struct e:12

--------------------------------

process exited after 0.01588 seconds with return value 20

請按任意鍵繼續. . .

結構的儲存所佔位元組數,必須能夠被它成員型別中所佔位元組最大的數值整除,不滿足的記憶體位置都會被空出來。

在**中我們用到了 offsetof 這個巨集 ,它是在 stddef.h 標頭檔案中定義的 #define offsetof(type, member)  ,

type 是結構型別 member 是成員名,這個表示式的結構是乙個 size_t 值,表示這個成員起始儲存位置距離結構開始儲存的位置的偏移的位元組數。

如果乙個程式中結構中的成員數量很少,或者結果的數量很少,並且你希望結構中的成員按照某種有意義的順序進行儲存,那麼你可以有充分的理由不對結構中的成員按照最節省空間的方式進行排序。但是如果程式中的結構很多那麼最緊迫需要的解決的就是空間浪費的問題。

c語言結構體在記憶體中儲存,位元組對齊

注意 出於效率的考慮,c語言引入了位元組對齊機制,一般來說,不同的編譯器位元組對齊機制有所不同,但還是有以下3條通用準則 1 結構體變數的大小能夠被其 最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位...

結構體在記憶體中的儲存方式

乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include using namespace std struct x s1 int main 在例一中的結構體變數s1定義之後,經測試,會發現sizeof s1 16,其值不等於sizeof s1.a 1 size...

C 中類和結構體在記憶體中的儲存問題

簡單點,非靜態成員變數占用空間,成員函式 無論是否是靜態的 則不占用空間 class myclass myclass類的例項中 占用2 4 8個位元組 即a b這兩個成員 涉及虛函式表那些你在另外研究。c 中struct和class在計算物件大小時你就不用區別了,計算方法一樣。就拿你的例子來說 一,...