我目前在做結構上的一些閱讀和整個被帶屬性的使用結構的例子來。在這個例子中,使用的struct屬性是[FieldOffset(0)]
,它說確保這些字段存儲在同一塊內存中。的Structs與FieldOffsetValueAttribute
什麼優勢(S)或這個缺點(S)? 另外一個爲什麼要使用FieldOffsetAttribute
把場存儲器的不同部分?
我目前在做結構上的一些閱讀和整個被帶屬性的使用結構的例子來。在這個例子中,使用的struct屬性是[FieldOffset(0)]
,它說確保這些字段存儲在同一塊內存中。的Structs與FieldOffsetValueAttribute
什麼優勢(S)或這個缺點(S)? 另外一個爲什麼要使用FieldOffsetAttribute
把場存儲器的不同部分?
這是用來控制在結構的成員的存儲器中的精確的偏移。當你想在P/Invoke調用的上下文中表示一個本地(C++)結構體時,它有時用在C#中。
在C#中沒有的東西,比如結構工會,所以你必須使用FieldOffsetValueAttribute
。
我建議你閱讀the following article。
偉大的鏈接。謝謝。 – CSharpened 2012-07-11 09:48:12
我已經看到了這個特技某處使用的,這將改變基礎類型的數組,從UINT到int,而不復制陣列的的元素:
[StructLayout(LayoutKind.Explicit)]
struct ArrayTypeChanger
{
[FieldOffset(0)]
public int[] ArrayOfInts;
[FieldOffset(0)]
public uint[] ArrayOfUInts;
}
和某處的類型 - 改變方法:
public static int[] ChangeArayType(uint[] input)
{
return new ArrayTypeChanger { ArrayOfUInts = input }.ArrayOfInts;
}
沒有內存被複制,這應該使它非常快。當然,只有類型具有相同的大小(sizeof(uint)== sizeof(int))纔有效。 不確定MS建議這...
其他更改此類數組類型(如Marshal.Copy())的方法涉及某種內存副本,這可能是一個大型數組的問題。
根據http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx:'這種對結構佈局的控制在使用平臺調用時很有用。「 – 2012-07-11 09:30:29
http ://en.wikipedia.org/wiki/Union_%28computer_science%29 – 2012-07-11 09:32:08
@AndreasNiedermair是的,但爲什麼? – CSharpened 2012-07-11 09:33:31