我知道有很多类似的问题,但我想了解非常特定于的方面,这些方面在任何地方都没有提到。在这两种情况下:托管(本例中为净运行时)和本机/unmanaged (c、cpp等)
从这里拍摄:https://adamsitnik.com/Value-Types-vs-Reference-Types


不仅没有掩盖,甚至也没有提到的第一个问题是,您的代码/运行时应该如何知道您正在处理的是哪种类型的结构?如果struct只是将它的所有数据打包在一起,那么关于它是什么类型的元数据在哪里呢?好的,在托管.NET运行时和二进制文件的情况下,它更容易,它是IL的一部分,但是本地二进制代码呢?如果您打开它进行文本读取,则在二进制文件中没有函数或结构名称。如果没有结构元数据,您如何知道运行时接收的是什么结构,以及如何处理/解析它?指针只是指向内存,但没有结构的结构和成员存储在那里。至少可以通过它所拥有的额外数据(对象头和方法表)来识别类。
当您从非托管/本机空间接收到结构化数据时,甚至会使更加混乱。您需要将这些数据嵌入到struct中,否则您如何知道您收到了什么?我甚至无法开始理解,这对于类似的类是如何工作的,因为它们比类要复杂上千倍。您如何从非托管空间返回类?
发布于 2021-04-19 07:21:09
如果struct只是它所有的数据打包在一起,那么关于它是哪种类型的结构的元数据在哪里?
根本就没有。对于原始值数据--无论是单个值,还是数组/向量/任何东西,消费代码都知道如何解释它。它是公正的:字节。
,如果没有结构元数据,您如何知道运行时接收的是什么结构,以及如何处理/解析它?
因为它是在API中定义的,或者是在签名中定义的,或者是用诸如“指针引用len类型的Foo元素的开始”之类的人工词定义的。
需要将数据嵌入到struct中。
不,你没有;你只需要事先同意你要发送/接收的内容。这就是绝大多数不同代码库之间的交互是如何工作的,而且一直都是这样工作的。拥有对象元数据是异常,而不是规范。
,您如何从非托管空间返回类?
如果这种上下文中的“类”指的是托管对象,则不会。
https://stackoverflow.com/questions/67157461
复制相似问题