gpt4 book ai didi

c# - UInt32[] 与 UInt32*

转载 作者:太空狗 更新时间:2023-10-30 01:26:39 25 4
gpt4 key购买 nike

大家下午好

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

internal extern static unsafe void CreateArray(Int32 size, [OutAttribute] UInt32* array);

但是,我认为通过传递 UInt32 数组而不是指针,可以用纯安全代码替换此不安全代码。代码更改为

internal extern static void CreateArray(Int32 size, [OutAttribute] UInt32[] array);

这似乎没有任何问题。但是,我宁愿谨慎。 GC 是否有可能出现并引起问题?传递数组和传递 UInt32 指针有很大区别吗?是否有我遗漏的角落案例?

感谢您的见解,

吉瓦

最佳答案

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

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

关于c# - UInt32[] 与 UInt32*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4406214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com