【问题标题】:pin_ptr performance relative to native (VC) heap objectspin_ptr 相对于本机 (VC) 堆对象的性能
【发布时间】:2010-01-05 16:18:42
【问题描述】:

在 C# 到本地 lib CLI/C++ 包装器中,我有一个选择:

  • 将本机指针存储在托管类中(使用本机“new”创建本机对象)

  • 将本机对象作为数据块存储在托管类的字段中,并在每次使用本机之前使用pin_ptr 将其固定。

有没有人对两条路径的相对性能成本做过比较分析?

谢谢!

【问题讨论】:

    标签: performance c++-cli pin-ptr


    【解决方案1】:

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

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

    【讨论】:

    • 这与返回局部变量的地址本质上是相同的问题......所以有经验的 C++ 程序员不会受到打扰,但任何来自托管世界的人都可能会遇到困难。
    【解决方案2】:

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

    但我自己没有测量过。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多