首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用非托管内存指针交换固定数组的指针

用非托管内存指针交换固定数组的指针
EN

Stack Overflow用户
提问于 2016-09-14 14:40:35
回答 1查看 463关注 0票数 0

我一直在用:

代码语言:javascript
运行
复制
    GCHandle pinArray(object a)
    {
        return GCHandle.Alloc(a, GCHandleType.Pinned);
    }

    void unpinArray(GCHandle h)
    {
        h.Free(); 
    }

在opencl方法之前和之后,因此数组在计算时不会移动。现在,我需要将支持数组指针与对齐的非托管数组指针交换,以便对其进行更快的读/写操作。

但是我找不到像“更改gchandle支持数组指针的值”之类的信息。

我需要一种类似“交换”的方法:

代码语言:javascript
运行
复制
 GCHandle h=pinArray(array);

 // how to?
 IntPtr oldBackingArray=exchange(h,alignedMallocCSpace(10000000,4096));

 // unmanaged operations
 copyValues(h,oldBackingArray);
 compute(array,...); // only passing with "array" for simplicity everywhere
 array[3]=5;
 l=array.toList();
 compute(array,....);
 Console.WriteLine(array[3]);
 copyValues(oldBackingArray,h);


 freeCSpace(exchange(h,oldBackingArray));

 unpinArray(h);

这是否需要反射才能访问和更改该变量?在计算方法中也有许多使用这些数组的C#方法,所以即使在C#空间中,它也能提供更快的速度吗?所以,我想让C#使用“数组”对象对所有东西使用alignedAlloc空间,直到我解开它为止。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-14 15:14:45

你不需要这么做。GCHandle与托管内存有关;非托管内存不需要任何类型的GCHandle。也不可能像它是一个托管数组那样与该内存对话。相反,您需要接受非托管数据是一个指针,而只是一个指针。你可以通过抽象来隐藏这些细节,但它不会改变现实。幸运的是,对于普通观察者来说,与SomeType[]交谈非常类似于与SomeType*交谈--只要你自己传递出它的长度。

在未来,即将到来的Span<T>在统一指针和数组方面做得很好,但这只是目前的实验。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39493305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档