我目前正在对结构进行一些阅读,并且遇到了与属性一起使用的结构的示例。在示例中,正在使用的struct属性是[FieldOffset(0)]
,它说它确保字段存储在同一块内存中。
这有什么优点或缺点?
另外为什么要使用FieldOffsetAttribute
将字段放在内存的不同部分?
答案 0 :(得分:2)
这用于控制结构成员在内存中的确切偏移量。当您想要在P/Invoke调用的上下文中表示本机(C ++)结构时,它有时会在C#中使用。
在C#中没有诸如结构联合之类的东西,所以你必须使用FieldOffsetValueAttribute
。
我建议你阅读the following article。
答案 1 :(得分:1)
我已经看到这个技巧在某个地方使用了,这将改变数组的基础类型,从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())会包含某种内存副本,这可能是大型数组的问题。