【发布时间】:2010-01-05 16:18:42
【问题描述】:
在 C# 到本地 lib CLI/C++ 包装器中,我有一个选择:
- 将本机指针存储在托管类中(使用本机“new”创建本机对象)
或
- 将本机对象作为数据块存储在托管类的字段中,并在每次使用本机之前使用
pin_ptr将其固定。
有没有人对两条路径的相对性能成本做过比较分析?
谢谢!
【问题讨论】:
标签: performance c++-cli pin-ptr
在 C# 到本地 lib CLI/C++ 包装器中,我有一个选择:
或
pin_ptr 将其固定。有没有人对两条路径的相对性能成本做过比较分析?
谢谢!
【问题讨论】:
标签: performance c++-cli pin-ptr
pin_ptr 是为了防止托管堆上的对象在其地址被传递给不知道椅子可能被 GC 拉走的本机函数时被 GC 移动。它不会影响在本机堆或堆栈上分配的内存。
在托管类中将本机对象存储为 blob 是托管 C++ 对混合类型所做的。在未固定的垃圾收集堆上返回指向内存的指针太容易了,以后可能会使应用程序崩溃,而且这个问题很难调试。这个问题非常普遍(人们不希望椅子可以被 GC 拉走),以至于微软决定完全禁用混合类型,所以人们必须明确指定对象的内存在哪里。
【讨论】:
可能没有太大区别。 GC 分配实际上比原生new 稍快。如果对象在 GC 进行收集时被固定,则固定只是一个性能问题。如果托管对象最终大到足以进入 LOH,则固定是免费的。
但我自己没有测量过。
我不会使用 GCHandle 将对象固定在函数调用之间。这比pin_ptr 的设置成本更高,并且更有可能影响 GC。对于需要永久保留的数据,请使用本机分配器。
【讨论】: