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