我目前正在阅读一些结构,并遇到了一个与属性一起使用的结构示例。在示例中,使用的 struct 属性是[FieldOffset(0)]
它所说的确保字段存储在同一块内存中。
这有什么好处或坏处?另外,为什么要使用FieldOffsetAttribute
将字段放在内存的不同部分?
我目前正在阅读一些结构,并遇到了一个与属性一起使用的结构示例。在示例中,使用的 struct 属性是[FieldOffset(0)]
它所说的确保字段存储在同一块内存中。
这有什么好处或坏处?另外,为什么要使用FieldOffsetAttribute
将字段放在内存的不同部分?
我在某处看到过这个技巧,它将改变数组的底层类型,从 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())涉及某种内存复制,这可能是大型数组的问题。