从C+;传递数据的最有效方式+;到C# 我正在寻找从C++(Stuttor或ValueC类)转移大量数据到C类的最好方法,尽可能少地复制数据。在下面的示例代码中,我有一个子类对象向量,它可能非常大(1000多万)。因此,如果可能的话,我希望避免数据拷贝 我是否应该先在GC中分配对象,然后直接在C++中使用它们,忘记本地C++结构?(性能是我关心的问题。) 或,我有没有办法利用C++中分配的数据而不引起数据拷贝?

从C+;传递数据的最有效方式+;到C# 我正在寻找从C++(Stuttor或ValueC类)转移大量数据到C类的最好方法,尽可能少地复制数据。在下面的示例代码中,我有一个子类对象向量,它可能非常大(1000多万)。因此,如果可能的话,我希望避免数据拷贝 我是否应该先在GC中分配对象,然后直接在C++中使用它们,忘记本地C++结构?(性能是我关心的问题。) 或,我有没有办法利用C++中分配的数据而不引起数据拷贝?,c#,c++,pinvoke,memcpy,C#,C++,Pinvoke,Memcpy,下面是我想在托管代码和非托管代码之间用作传输的示例 #include <string> #include <vector> struct SubClass { std::string DataItem1; // lots more here std::string DataItem50; }; struct Sample { int IntValue; std::string StringValue; std::vecto

下面是我想在托管代码和非托管代码之间用作传输的示例

#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;
};
#包括
#包括
结构子类{
std::stringdataitem1;
//这里还有很多
std::字符串DataItem50;
};
结构样本{
int值;
std::字符串字符串值;
std::向量小列表;
病媒雨果主义者;
};

如果我可以避免使用PrEnKee和COM类进入杂草,我宁愿使用它。

< P>在Unity(使用C)的例子后面,使用GC句柄将数据从C++传递到C++。我们可以尝试相反的方式从C++发送数据到C。 固定一个C#变量以允许更快的复制

使用系统;
使用系统集合;
使用System.Runtime.InteropServices;
//顶点是向量3[],其中向量3是结构
//使用顺序布局属性进行3次浮点运算
无效测试(){
GCHandle gcVertices=GCHandle.Alloc(顶点,GCHandleType.pinted);
}

使用封送处理将句柄传递给C++。你不得不复制一些东西,这是不可避免的。在这里复制指针应该足够好了。根据Microsoft提供的有关封送处理的更多信息

[DllImport(“您的dll”)]
私有静态外部无效发送句柄(IntPtr vertexHandle,int vertexCount);
SendHandle(gcVertices,vertices.Length);
C++内部,你将把句柄作为指针类型,选择给C++类型。在这种情况下,
顶点
是由3个浮点数组成的结构列表。参考代码决定使用
float*
。您只需要根据指针类型正确执行指针算术,包括
void*
的情况

extern“C”\uuu decl(dllexport)void sendhold(float*顶点,int vertexCount);
这里的示例代码直接从指针复制数据,但也可以写入指针的位置

for(int i=0;i
从C#侧清理固定手柄以恢复垃圾收集器

gcVertices.Free();

至于字符串,我相信interop库有一个实现,可以为您处理指针算术和复制。您可以在Extring导出函数中直接使用字符串类型,只要指定如何在C++中使用“代码”> MsHalalas属性和C++中的库来封送它,如果您没有转换为C类型<代码> CHAR*< /代码>。< /P>是DLL的C++代码部分?是的。我正在编写DLL代码,所以我不需要尝试使用第三方关闭的DLL。我目前正在编写DLL以直接使用CLI对象,但这意味着我必须编写两个例程来执行相同的操作。一个用于.NET侧,一个用于C++侧。使用包装器将隔离层,但以性能为代价,这可能不是正确的选择。也许有一种类型化的方法来做这件事,我可以在.NET构建和C++构建之间切换,并保存自己的重新编码。你应该能够将子类的C引用引用到C++ DLL中。您需要确保数据成员对齐。下面是一篇stackoverflow文章:这需要一个副本,因为您无法封送变量数组。不幸的是,我到处都有这种情况。要引导子类(100+)是如此之深且重载(可能高达12级),甚至使用编组创建一些东西都是一个挑战。如果不进行复制,您将无法使用std::string和std::vector。