本來打算寫一篇文章,詳細地討論一下結構的記憶體布局,但是想了下,跟路西菲爾的這篇[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位元組。在記憶體中,結構體內的元素分布不是緊挨著依次排布的,而是存在著 記憶體對齊 因為硬體原因,讀取記憶體要按照一定的偏移量來儲存,那麼儲存資料也相應按照一定的偏移量儲存,也就是相應元素型別的長度。所以在記憶體中,每個元素都 以為 ...