C#中的C ++联合
时间:2020-03-06 14:39:28 来源:igfitidea点击:
我正在将用C ++编写的库转换为C#,并且关键字"联合"存在一次。在结构中。
将其转换为C#的正确方法是什么?它是做什么的?看起来像这样;
struct Foo { float bar; union { int killroy; float fubar; } as; }
解决方案
我们可以为此使用显式字段布局:
[StructLayout(LayoutKind.Explicit)] public struct SampleUnion { [FieldOffset(0)] public float bar; [FieldOffset(4)] public int killroy; [FieldOffset(4)] public float fubar; }
未经测试。这个想法是两个变量在结构中具有相同的位置。当然,我们只能使用其中之一。
结构教程中有关联合的更多信息
在C / C ++中,并集用于在同一内存位置覆盖不同的成员,因此,如果我们拥有一个int和float的并集,它们都使用相同的4个字节的内存来存储,显然写一个会破坏另一个int和float具有不同的位布局)。
在.Net中,Microsoft选择了更安全的选择,但没有包含此功能。
编辑:互操作性除外
我个人将全部忽略UNION,并将Killroy和Fubar分别实现为单独的字段
public struct Foo { float bar; int Kilroy; float Fubar; }
使用UNION可以节省int分配的32位内存....这些天不会制作或者破坏应用程序。
我们不知道如何使用它就无法真正决定如何处理它。如果仅用于节省空间,则可以忽略它而仅使用结构。
但是,这通常不是为什么使用工会的原因。有两个共同的原因来使用它们。一种是提供两种或者更多种访问同一数据的方式。例如,将int和4个字节组成的数组的并集是(多种)分离32位整数的字节的一种方法。
另一个是当结构中的数据来自外部源(例如网络数据包)时。通常,包含联合的结构的一个元素是ID,该ID告诉我们联合的哪种样式有效。
在这两种情况下,我们都不能盲目地忽略联合并将其转换为两个(或者更多)字段不一致的结构。