Vb.net 对象数组到字节数组-Marshal.AllocHGlobal碎片查询

Vb.net 对象数组到字节数组-Marshal.AllocHGlobal碎片查询,vb.net,visual-studio-2010,.net-4.0,marshalling,fragmentation,Vb.net,Visual Studio 2010,.net 4.0,Marshalling,Fragmentation,我不认为在中发表评论是公平的,所以我想我应该把它作为一个新问题来问 注意:无论如何,这都不是答案的关键,在深入研究内存管理/封送处理类之前,我只是想了解这一切 在这个答案中,函数GetByteArray在循环中为给定数组中的每个对象分配内存 上述文章中的GetByteArray函数是否从为所提供数组的总大小分配内存中获益匪浅: Dim arrayBufferPtr = Marshal.AllocHGlobal(Marshal.SizeOf(<arrayElement>) * <

我不认为在中发表评论是公平的,所以我想我应该把它作为一个新问题来问

注意:无论如何,这都不是答案的关键,在深入研究内存管理/封送处理类之前,我只是想了解这一切

在这个答案中,函数GetByteArray在循环中为给定数组中的每个对象分配内存

上述文章中的GetByteArray函数是否从为所提供数组的总大小分配内存中获益匪浅:

Dim arrayBufferPtr = Marshal.AllocHGlobal(Marshal.SizeOf(<arrayElement>) * <array>.Count)
Dim arrayBufferPtr=Marshal.AllocHGlobal(Marshal.SizeOf(

到目前为止,我最喜欢的是:

可以为整个阵列分配非托管内存,然后使用SizeOf(arrayElement)*loopIndex偏移量复制每个数组元素。根据当前平台,最好使用适当的ToInt32/ToInt64方法,如:

Dim anOffsetPtr if arrayBufferPtr.Size = 4 then anOffsetPtr = New IntPtr(arrayBufferPtr.ToInt32() + (loopIndex * arrayElementSize)) else anOffsetPtr = New IntPtr(arrayBufferPtr.ToInt64() + (loopIndex * arrayElementSize)) endif 暗淡无偏移 如果arrayBufferPtr.Size=4,则 anOffsetPtr=New IntPtr(arrayBufferPtr.ToInt32()+(loopIndex*arrayElementSize)) 其他的 anOffsetPtr=New IntPtr(arrayBufferPtr.ToInt64()+(loopIndex*arrayElementSize)) 恩迪夫
哦,当然了。我没有想过要检查IntPtr的大小,也没有遇到显示这一点的代码,我已经在考虑确定平台的最佳方法。+1(可能会在适当的时候回答).我想你也不知道有什么好文章吗?-肯定还有更多的文章,例如,提到IntPtr.Size技巧…?注意;C#示例可能也很好-我认为上面的双等号更符合你的偏好。为C#代码找到不直接转换为VB的变通方法也很有趣。^^@Smudge202-我只使用封送处理类引用,对所有在托管和非托管编程方面都有经验的人来说,这是绝对清楚的。很抱歉出现语法错误,VB不是我的母语:) Dim anOffsetPtr if arrayBufferPtr.Size = 4 then anOffsetPtr = New IntPtr(arrayBufferPtr.ToInt32() + (loopIndex * arrayElementSize)) else anOffsetPtr = New IntPtr(arrayBufferPtr.ToInt64() + (loopIndex * arrayElementSize)) endif