【发布时间】:2015-03-19 12:02:07
【问题描述】:
我正在寻找将大量数据从 C++(结构或值类?)传输到 C# 类的最佳方法,尽可能少地复制数据。在下面的示例代码中,我有一个可能非常大(10+ 百万)的子类对象向量。所以我想尽可能避免数据复制。
我是否应该/我可以先在 GC 中分配对象,然后直接在 c++ 中使用它们而忘记原生 c++ 结构? (性能是我关心的问题。)
或者,是否有一些技巧可以利用 C++ 中分配的内容而不导致数据复制?
这是一个示例,我想用作托管代码和非托管代码之间的传输。
#include <string>
#include <vector>
struct SubClass {
std::string DataItem1;
// lots more here
std::string DataItem50;
};
struct Sample {
int IntValue;
std::string StringValue;
std::vector<std::string> SmallList;
std::vector<SubClass> HugeList;
};
如果我可以避免使用 pinvoke 和 COM 类,我会更喜欢它。
【问题讨论】:
-
你的 C++ 代码是 DLL 的一部分吗?
-
是的。我正在编写 DLL 代码,所以我不需要尝试使用第三方封闭的 DLL。我目前正在编写 DLL 以直接使用 CLI 对象,但这意味着我必须编写两个例程来做同样的事情。一个用于 .NET 端,一个用于 C++ 端。使用包装器会隔离层,但以性能为代价,它可能不是正确的选择。也许有一种 typename 方式可以做到这一点,我可以在 .NET 构建和 c++ 构建之间切换并节省自己重新编码?
-
您应该能够将子类的 C# 引用传递到 c++ DLL 中。您需要确保数据成员对齐。这里有一篇 stackoverflow 文章可以看:stackoverflow.com/questions/3939867/…
-
这需要一个副本,因为您不能编组变量数组。不幸的是,我到处都有这种情况。引导子类 (100+) 如此深且重载(可能高达 12 级深),即使使用编组创建某些东西也是一个挑战。
-
如果不复制,您将无法使用 std::string 和 std::vector。