0

我目前正在阅读一些结构,并遇到了一个与属性一起使用的结构示例。在示例中,使用的 struct 属性是[FieldOffset(0)]它所说的确保字段存储在同一块内存中。

这有什么好处或坏处?另外,为什么要使用FieldOffsetAttribute将字段放在内存的不同部分?

4

2 回答 2

2

这用于控制结构成员在内存中的确切偏移量。当您想在P/Invoke调用的上下文中表示本机 (C++) 结构时,有时会在 C# 中使用它。

在 C# 中没有结构联合之类的东西,所以你必须使用FieldOffsetValueAttribute.

我建议您阅读以下文章

于 2012-07-11T09:37:11.330 回答
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())涉及某种内存复制,这可能是大型数组的问题。

于 2012-07-11T09:55:47.790 回答