C 結構體內存布局介紹

2021-08-30 20:22:41 字數 1096 閱讀 7162

本來打算寫一篇文章,詳細地討論一下結構的記憶體布局,但是想了下,跟路西菲爾的這篇[url=文章[/url]也差不多,所以這裡只做一下補充:

一、對齊長度

如果沒有顯式的指定對齊長度,將以結構中占用空間最大的成員的長度作為對齊長度;如果要顯式指定對齊長度,需設定structlayoutattribute.pack,如:

[structlayout(layoutkind.sequential,pack=4)]

struct mystruct

對齊長度的作用在於:如果某個欄位的長度大於或等於對齊長度,則對齊長度沒用;如果小於對齊長度,則以對齊長度為單元,占用的空間是對齊長度的整數倍,同時保證不大於對齊長度的字段一定分配在同一單元,並且其首位址一定是字段長度的整數倍。

如:

struct mystruct

第0個位元組為a,第1個位元組無資料,第2,3個位元組為b,第4,5,6,7為c。

二、「詭異」的decimal型別

有這樣乙個結構,請問其占用空間是多少?

struct mystruct

最初我以為是48個位元組,因為int是4個位元組,decimal是16個位元組,double是8個位元組,decimal最大,所以以16個位元組對齊,所以是48個位元組。

但實際上是32個位元組。

這其中的原因在於,decimal是由4個int構成的:

struct decimal

所以上述結構中佔記憶體最大的成員是double,對齊長度是8

三、.net中實現c語言的union

可以通過下面的自定義字段位置的方法,在.net中實現c風格的union

[structlayout(layoutkind.explicit)]

struct mystruct

從0開始計數,第2個位元組為a,b共用,第3個位元組為a,b,c共用。

結構體對齊 結構體內存布局

在c語言中,可以通過 pragma pack n 來指定結構體按n位元組對齊 這裡的n是2的較小整數次冪 如果程式設計者不指定對齊位元組數,那麼預設的會按照結構體中最長那一項對齊,如在64位作業系統中,當結構體中出現 void long 型別,則必然是按照8位元組對齊 當最大的是int,那麼就按照4...

C 結構體內存對齊

最近工作時需要用到記憶體對齊,查了資料。發現比較亂且觀點不一,因此驗證並總結。下面所寫都是在實際中得到驗證。環境 xp,vc6.0.記憶體對齊又稱位元組對齊,可以加快系統的處理速度。在結構體中的儲存中尤其重要,那麼系統對齊是按照什麼方式呢?每個特定平台上的編譯器都有自己的預設 對齊係數 也叫對齊模數...

C結構體內存對齊

struct mystc 這樣的乙個結構體多大?反正不是1 4 2位元組。在記憶體中,結構體內的元素分布不是緊挨著依次排布的,而是存在著 記憶體對齊 因為硬體原因,讀取記憶體要按照一定的偏移量來儲存,那麼儲存資料也相應按照一定的偏移量儲存,也就是相應元素型別的長度。所以在記憶體中,每個元素都 以為 ...