C 位元組對齊

2021-10-13 21:49:28 字數 2890 閱讀 3396

兩個規則:

1、成員之前需要補齊

public

struct person

static

void

main

(string

args)

console.

writeline

(marshal.

sizeof

(p))

;//4

}

指定對齊值packlen為4(預設的沒有寫出來)。有效對齊值=min(packlen,defaultlen)。

a的偏移量為0,該欄位有效對齊值為1,滿足對齊方式,占用1byte。

下乙個可用位址的偏移量為1,不是欄位b的有效對齊值的倍數,所以需要補齊乙個位元組使偏移量變為2。所以需要欄位a後面補足乙個位元組,欄位a佔兩個位元組。保證b的偏移量為2,滿足對齊方式,b佔2位元組。

所有成員都分配了空間,空間總大小為2+2=4byte,是最大有效對齊值2的倍數,所以最終大小為4byte。

1、結構體最後需要補齊

public

struct person

static

void

main

(string

args)

console.

writeline

(marshal.

sizeof

(p))

;//6

}

欄位a偏移量為0,有效對齊值為1,滿足對齊方式,佔1乙個位元組。

下乙個欄位的偏移量為1,有效對齊值為2,不滿足對齊方式。所以需要在a後面補齊乙個位元組,使下乙個欄位的偏移量為2。

所以欄位a需要佔兩個位元組。b的偏移量為2,b佔兩個位元組。

c欄位的偏移量為4,有效對齊值為1,滿足對齊方式,占用乙個位元組。

總成員佔2+2+1=5,不是最大有效對齊值2的倍數,所以最後乙個需要補齊1個位元組。總位元組為2+2+1+1=6。

3、結構體中成員順序

public

struct person

static

void

main

(string

args)

console.

writeline

(marshal.

sizeof

(p))

;//4

}

還是上面的乙個例子,我們調整了一下順序,正好把成員c放在了a後面,這樣a後面就不需要補齊乙個位元組了,結構體總共佔4位元組。所以在結構體成員中盡量按所佔位元組從小到大排列,這樣可能會使整個結構體占用空間變小。

允許的值有structlayout.auto 、structlayout.sequential 和structlayout.explicit。預設的記憶體排列就是sequential,也就是按成員的先後順序排列;explicit可以精確布局記憶體,需要用fieldoffset()設定每個成員的位置,這樣就可以實現類似c的公用體的功能。

charset定義在結構中的字串成員在結構被傳給dll時的排列方式。可以是unicode、ansi或auto,預設為auto。指示在預設情況下是否應將類中的字串資料字段作為lpwstrlpstr進行封送處理。

pack定義了結構的封裝大小。可以是1、2、4、8、16、32、64、128或特殊值0。特殊值0表示當前操作平台預設的壓縮大小。

指示類或結構的絕對大小

[

structlayout

(layoutkind.sequential,pack =1)

]public

struct person

static

void

main

(string

args)

console.

writeline

(marshal.

sizeof

(p))

//10

}

這裡就不做解釋了,只是修改了指定對齊值為1。

[

structlayout

(layoutkind.explicit,size =12)

]public

struct person

static

void

main

(string

args)

console.

writeline

(marshal.

sizeof

(p))

;//12

}

explicit一般與size一起使用,不然最終的大小不是期待的。

[

structlayout

(layoutkind.explicit,size =1)

]public

struct person

static

void

main

(string

args)

console.

writeline

(marshal.

sizeof

(p))

;//1

p.a =

100;

console.

writeline

(p.b)

;//100

}

mysql位元組對齊 C 位元組對齊彙總

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

c 位元組對齊

1.虛函式 如果 classa 有虛函式,編譯器會給每個 classa 物件新增乙個隱藏成員,該隱藏成員儲存了乙個指向虛函式表的指標.所以 sizeof classa 如果比你預想的多了 4 位,不要驚奇,因為多了乙個 size 指標 但是這個隱藏指標是先算還是後算呢?class a int a c...

c 位元組對齊

在 c 中位元組對齊主要存在符合型別中 union struct 和class中 先介紹四個概念 1 資料型別自身的對齊值 基本資料型別的自身對齊值,等於sizeof 基本資料型別 2 指定對齊值 pragma pack value 時的指定對齊值value。3 結構體或者類的自身對齊值 其成員中自...