c++/cli 中的 gcroot

发布于 2024-10-17 18:39:12 字数 36 浏览 1 评论 0原文

gcroot 是什么意思?我在我正在阅读的代码中找到了它。

What does gcroot mean? I found it in code I am reading.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

韬韬不绝 2024-10-24 18:39:12

gcroot 是一个 C++/cli 模板类,可以轻松地在 C++/cli 类中保存托管类型。

例如,您可以具有以下内容:

#include <msclr/gcroot.h>
using namespace msclr;

class Native {
  public:
    Native(Object ^obj) :
      netstring(obj->ToString()) { // Initializing the gcroot<String ^>
    }
    ~Native() {
    }
    void Print() {
      array<Char> ^chars = netstring->GetChars(); // Dereferencing the gcroot<String ^>
      _wprintf("netstring is:");
      if (chars->Length > 0) {
        pin_ptr<Char> charptr = &(chars[0]);
        _wprintf("%s", (wchar_t const *)charptr);
      }
    }
  private:
    gcroot<String ^> netstring;
};

gcroot 充当对托管对象或值类型实例的引用,并在复制对象或值类型实例时执行所有工作。
通常您需要使用 GCHandle 和 .NET 框架的一些 C 函数。这一切都封装在 gcroot 中。

gcroot is a C++/cli template class that eases holding managed types in C++/cli classes.

You can for example have the following:

#include <msclr/gcroot.h>
using namespace msclr;

class Native {
  public:
    Native(Object ^obj) :
      netstring(obj->ToString()) { // Initializing the gcroot<String ^>
    }
    ~Native() {
    }
    void Print() {
      array<Char> ^chars = netstring->GetChars(); // Dereferencing the gcroot<String ^>
      _wprintf("netstring is:");
      if (chars->Length > 0) {
        pin_ptr<Char> charptr = &(chars[0]);
        _wprintf("%s", (wchar_t const *)charptr);
      }
    }
  private:
    gcroot<String ^> netstring;
};

gcroot acts as a reference to the managed object or value type instance and is doing all the work when copying the object or value type instance.
Normally you need to work with GCHandle and some C functions of the .NET framework. This is all encapsulated in gcroot.

迷雾森÷林ヴ 2024-10-24 18:39:12

当.NET垃圾收集器运行时,它通过进行可达性分析来确定哪些对象仍在使用中。在查找指向对象的指针时,仅分析托管堆,因此,如果您有一个从本机对象到托管对象的指针,则需要让垃圾收集器知道,以便它可以将其包含在可达性分析中,这样它就可以如果目标在压缩期间移动,则更新指针。

正如 rstevens 所说,.NET GCHandle 类执行此操作,而 C++/CLI 是面向 C++ 的 GCHandle 包装器,它增加了类型安全性和方便的语法。

When the .NET garbage collector runs, it determines which objects are still in use by doing reachability analysis. Only the managed heap is analyzed while looking for pointers to objects, so if you have a pointer from a native object to a managed object, you need to let the garbage collector know, so it can include it in reachability analysis, and so it can update the pointer if the target moves during compaction.

As rstevens said, the .NET GCHandle class does this, and C++/CLI is a C++-oriented wrapper for GCHandle which adds type safety and convenient syntax.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文