C++ cli 有没有办法在不复制数据的情况下将本机阵列转换为托管阵列?
当我访问文件以获取保存的对象时,我当前通过以下路径:C++ cli 有没有办法在不复制数据的情况下将本机阵列转换为托管阵列?,c++-cli,C++ Cli,当我访问文件以获取保存的对象时,我当前通过以下路径: 将序列化流读入本机缓冲区 将本机缓冲区复制到托管缓冲区 反序列化(我正在使用netserializer) 复制不是一个大问题,但它似乎没有必要,所以我想消除它,如果可能的话 我想我找到了一个聪明的方法,让stream read函数接受char*(*allocFunc)(ItemLengthType)的函数指针,然后直接将数据读入固定的托管数组,如下所示: array<Byte>^ serBuf; itemStrea
array<Byte>^ serBuf;
itemStream->ReadItem(i, [=](uint32_t len){
serBuf = gcnew array<Byte>(len);
pin_ptr<Byte> pData = &serBuf[0];
return reinterpret_cast<char*>(pData);
});
array^serBuf;
itemStream->ReadItem(i,[=](uint32\u t len){
serBuf=gc新阵列(len);
pin_ptr pData=&serBuf[0];
返回重新解释(pData);
});
但是epic fail,不能在lambda函数中捕获托管对象,甚至不能在托管类中创建lambda函数
我看到的唯一其他选择是将我的流类转换为托管类,并让它生成托管数组,但该类来自另一个项目,我在许多其他与CLR无关的解决方案中使用该项目。我也不打算创建该项目的半管理分支,只是太麻烦了
是否有其他方法可以避免复制步骤?无法将本机缓冲区转换为托管阵列,但您仍然可以取消复制步骤 改用此流程:
数组
),导致字符*
char*
,就像它是本机缓冲区一样pin_ptr
获得一个普通的char*
。将数据读入其中,然后取消对数组的绑定。然后,像平常一样将托管数组传递给反序列化程序
注意到,数组的钉住应该是短时间的:当某个东西被钉住时,这是垃圾收集器的额外工作,因为在它要重新排列的一大块内存的中间,有一个数组,你告诉它不要移动。 我还建议您分析应用程序,看看从本机缓冲区到托管阵列的额外拷贝对性能的影响有多大。这可能比你想象的要少,在这种情况下,我倾向于清晰易懂的代码