Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cli 有没有办法在不复制数据的情况下将本机阵列转换为托管阵列?_C++ Cli - Fatal编程技术网

C++ cli 有没有办法在不复制数据的情况下将本机阵列转换为托管阵列?

C++ cli 有没有办法在不复制数据的情况下将本机阵列转换为托管阵列?,c++-cli,C++ Cli,当我访问文件以获取保存的对象时,我当前通过以下路径: 将序列化流读入本机缓冲区 将本机缓冲区复制到托管缓冲区 反序列化(我正在使用netserializer) 复制不是一个大问题,但它似乎没有必要,所以我想消除它,如果可能的话 我想我找到了一个聪明的方法,让stream read函数接受char*(*allocFunc)(ItemLengthType)的函数指针,然后直接将数据读入固定的托管数组,如下所示: array<Byte>^ serBuf; itemStrea

当我访问文件以获取保存的对象时,我当前通过以下路径:

  • 将序列化流读入本机缓冲区
  • 将本机缓冲区复制到托管缓冲区
  • 反序列化(我正在使用netserializer)
  • 复制不是一个大问题,但它似乎没有必要,所以我想消除它,如果可能的话

    我想我找到了一个聪明的方法,让stream read函数接受char*(*allocFunc)(ItemLengthType)的函数指针,然后直接将数据读入固定的托管数组,如下所示:

        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*
    ,就像它是本机缓冲区一样
  • 取消锁定托管缓冲区
  • 反序列化
  • 要执行步骤1,只需分配一个托管字节数组并使用
    pin_ptr
    获得一个普通的
    char*
    。将数据读入其中,然后取消对数组的绑定。然后,像平常一样将托管数组传递给反序列化程序

    注意到,数组的钉住应该是短时间的:当某个东西被钉住时,这是垃圾收集器的额外工作,因为在它要重新排列的一大块内存的中间,有一个数组,你告诉它不要移动。 我还建议您分析应用程序,看看从本机缓冲区到托管阵列的额外拷贝对性能的影响有多大。这可能比你想象的要少,在这种情况下,我倾向于清晰易懂的代码