我正在做一些本地庫的互操作,它有一些非自然對齊功能,我想在.NET結構中模擬佈局。檢查這兩個結構中:如何設置.NET結構的非自然對齊?
public struct Int3
{
public int X;
public int Y;
public int Z;
}
public struct MyStruct
{
public short A;
public Int3 Xyz;
public short B;
}
所以,在.NET中,它使用自己的佈局規則創建的佈局,這是,定位是分鐘(的sizeof(primitiveSize),StructLayout.Pack)。所以MYSTRUCT的佈局將是:
[oo--] MyStruct.A (2 bytes data and 2 bytes padding)
[oooo oooo oooo] MyStruct.Xyz (3 int, no padding)
[oo--] MyStruct.B (2 bytes data and 2 bytes padding)
我想要做的是,我想INT3的定位更改爲8個字節,喜歡的東西:
[StructLayout(Alignment = 8)]
public struct Int3 { .... }
然後MYSTRUCT的佈局會成爲:
[oo-- ----] MyStruct.A (2 bytes for data, and 6 bytes padding, to align next Xyz to 8
[oooo oooo oooo ----] MyStruct.Xyz (4 bytes padding for alignment of 8)
[oo-- ----] (6 bytes padding, because the largest alignment in this struct is 8)
所以,我的問題是:
1)是否有.NET來控制n個這樣的屬性像這樣的自然對齊? 2)如果沒有這樣的內置屬性,我知道還有其他屬性,如StructLayout.Explict,OffsetAttribute,StructLayout.Size,StructLayout.Pack。有了這些屬性,我可以手動模擬這種佈局,但不便於使用。所以我的第二個問題是,有沒有辦法掛鉤到.NET結構佈局創建,我可以干預結構佈局?我的意思是,我可以創建一個自定義屬性來指定對齊方式,然後計算佈局,但我不知道如何幹涉.NET來使用該佈局。
問候,祥。
不需要。您需要使用屬性。那有什麼問題? – 2013-04-07 11:10:28
@CodyGray問題是,.NET會認爲Int3的對齊方式是4,因爲它只檢查每個成員是基本類型,在本例中爲int。但在某些本地代碼中,爲了獲得更好的性能,他們需要認爲Int3可以在8邊界甚至16字節邊界處對齊。所以.NET看起來沒有辦法看到非原始類型的對齊。 – 2013-04-07 11:57:42
雖然我仍然不完全確定自己理解這個問題。爲什麼你不能只使用屬性來改變對齊方式?除非我誤解了這個問題,否則我認爲你正在尋找[StructLayout屬性的Pack字段](http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.pack的.aspx)。像這樣:'[StrutLayout(LayoutKind。Sequential,Pack = 8)]' – 2013-04-07 12:01:24