就是那个问题。有什么你可以用 c++ unions 做而你不能用 c# Explicit structs 做的事情吗?
问问题
156 次
3 回答
2
C# 显式结构在引用/指针大小的成员方面存在一些问题。
因为您必须显式指定位置,但“sizeof(IntPtr)”不是编译时常量(与 C++ sizeof 不同),所以当您的程序集应该在 32-位和 64 位进程。
此外,可以使用显式结构在引用和指针之间“转换”:
[StructLayout(LayoutKind.Explicit)]
struct Test
{
[FieldOffset(0)]
public IntPtr ptr;
[FieldOffset(0)]
public string str;
}
当你这样做时,你的程序集将需要不安全的代码权限;还有一个问题是 GC 不知道如何处理结构内容 - 它是 GC 应该跟踪的指针,还是只是一个整数?
所以回答你的问题:“你可以用 c++ 联合做些什么,而用 c# Explicit 结构做不到吗?”
是的,有时在 C++ 中将两位数据压缩到指针的低位是很有用的。这是可能的,因为当指针对齐时,指针的最低两位将始终为 0。
哎呀,如果您正在编写一个两位整数的双向链表,您甚至可以将指针和数据都存储在 32 位中!(“上一个^下一个^数据”,见异或链表)
但是,您不能在 C# 中执行类似的操作,因为您会混淆 GC。
于 2009-07-22T01:25:09.200 回答
1
不,不是。LayoutKind 属性是一种将数据编组到互操作中的 C++ 联合的方法。它实际上比 C++ 中的 union 关键字灵活得多,因为您可以使用结构完全控制 C# 中的布局。
于 2009-07-22T00:16:59.403 回答
0
您不能在数据上重叠另一种类型的数组。例如,不能覆盖 byte[4] 和 int16、int16。它会在运行时崩溃。
于 2012-01-26T20:25:09.730 回答