0

In a C# to native lib CLI/C++ wrapper, I have a choice:

  • Store native pointer in a managed class (native object is created using native "new")

or

  • Store native object as a data blob in a managed class' field, and use pin_ptr to pin it before each native use.

Has anyone done any comparative analysis on the relative performance costs of the two paths?

Thanks!

4

2 回答 2

1

pin_ptr 是为了防止托管堆上的对象在其地址被传递给不知道椅子可能被 GC 拉走的本机函数时被 GC 移动。它不会影响在本机堆或堆栈上分配的内存。

将本机对象作为 blob 存储在托管类中是托管 C++ 对混合类型所做的。在未固定的垃圾收集堆上返回指向内存的指针太容易了,以后可能会使应用程序崩溃,而且这个问题很难调试。这个问题非常普遍(人们不希望椅子可以被 GC 拉走),以至于微软决定完全禁用混合类型,所以人们必须明确指定对象的内存在哪里。

于 2010-01-06T17:54:52.093 回答
1

应该没有太大区别吧。GC 分配实际上比 native 稍快new。如果对象在 GC 进行收集时被固定,则固定只是一个性能问题。如果托管对象最终大到足以进入 LOH,则固定是免费的。

但我自己没有测量过。

我不会做的是使用 GCHandle 将对象固定在函数调用之间。这比 a 的设置成本更高,pin_ptr并且更有可能影响 GC。对于需要永久保留的数据,请使用本机分配器。

于 2010-06-25T01:51:34.930 回答