首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UInt32[]与UInt32*

UInt32[]与UInt32*
EN

Stack Overflow用户
提问于 2010-12-10 14:15:04
回答 1查看 561关注 0票数 4

大家下午好,

我一直致力于通过InteropServices.DllImport访问一些外部DLL。我最初选择了一些不安全的代码,如下所示:

代码语言:javascript
复制
internal extern static unsafe void CreateArray(Int32 size, [OutAttribute] UInt32* array);

但是,我认为可以通过传递UInt32数组而不是指针来将这种不安全的代码替换为纯粹的安全代码。代码将更改为

代码语言:javascript
复制
internal extern static void CreateArray(Int32 size, [OutAttribute] UInt32[] array);

这似乎没有任何问题的工作。然而,我在谨慎方面犯了错误。有没有可能GC现在出现了并造成问题?传递数组和传递UInt32指针有很大区别吗?有没有我漏掉的角落里的箱子?

感谢你的洞察,

吉瓦瓦

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-10 14:16:46

后者很好。P/Invoke层将在CreateArray执行时将托管数组固定在内存中,这种方法不需要封送处理,因为UInt32[]是一个blittable type。因此,这将与使用指针一样快。

使用前一个声明,除非您打算完全通过指针对输出进行操作,否则必须将内存复制到适当的托管数组中。而且这种复制会更昂贵。因此,换句话说,如果您试图从调用中获得一个适当的托管数组,使用后一种语法将会执行得更好,并且不需要手动提取数据。

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

https://stackoverflow.com/questions/4406214

复制
相关文章

相似问题

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