1

就是那个问题。有什么你可以用 c++ unions 做而你不能用 c# Explicit structs 做的事情吗?

4

3 回答 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 回答