UInt32[] 与 UInt32* 的区别

4

大家下午好,

我一直在使用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);

这个似乎没有问题。然而,我还是比较谨慎。垃圾回收是否可能会引起问题?传递数组和传递UInt32指针之间有很大的区别吗?是否有我忽略的特殊情况?

感谢您的见解,

Giawa

1个回答

4
后者更好。P/Invoke层将在执行CreateArray时将托管数组固定在内存中,而且这种方法不需要进行任何调用,因为UInt32[]是一个可按位复制类型。因此,这将与使用指针一样快。

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


cdhowie,如果我理解正确的话,修改Uint32[] array变量不会影响原始数据吗?(例如,它执行复制) - user166390
@pst:不,非托管函数将被赋予一个指向数组数据开头的指针。 - cdhowie
我在想一个解决方法是获取一个GCHandle并固定数组 - 但很酷的是P/Invoke已经为我做了这个。谢谢你的回复! - Giawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接