C# 具有FieldOffsetValueAttribute的结构

C# 具有FieldOffsetValueAttribute的结构,c#,attributes,struct,C#,Attributes,Struct,我目前正在读一些关于结构的书,遇到了一个结构与属性一起使用的例子。在本例中,使用的struct属性是[FieldOffset(0)],它表示确保字段存储在同一块内存中 这有什么优点或缺点? 还有,为什么要使用FieldOffsetAttribute将字段放在内存的不同部分?这用于控制结构成员在内存中的确切偏移量。当您希望在调用上下文中表示本机(C++)结构时,有时在C#中使用它 在C语言中,没有结构联合之类的东西,因此必须使用FieldOffsetValueAttribute 我建议您阅读。这用

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

这有什么优点或缺点?
还有,为什么要使用
FieldOffsetAttribute
将字段放在内存的不同部分?

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

在C语言中,没有结构联合之类的东西,因此必须使用
FieldOffsetValueAttribute


我建议您阅读。

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

在C语言中,没有结构联合之类的东西,因此必须使用
FieldOffsetValueAttribute


我建议您阅读。

我在某个地方见过这种技巧,它可以将数组的基本类型从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())会带来某种内存拷贝,这对于大型数组可能是个问题。

我在某些地方见过这种技巧,它会将数组的基本类型从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())解决某些类型的内存拷贝,这可能是大型阵列的一个问题。

根据:
这种对结构布局的控制在使用平台调用时很有用。
@andreasniedermir是的,但为什么?根据:
这种对结构布局的控制在使用平台调用时很有用。
@andreasniedermir是的,但是为什么?