C# Marshal.ReadInt32等与不安全上下文和指针有何不同?
特别是:元帅更安全吗?指针更快吗C# Marshal.ReadInt32等与不安全上下文和指针有何不同?,c#,.net,unmanaged,C#,.net,Unmanaged,特别是:元帅更安全吗?指针更快吗 int pixel = Marshal.ReadInt32(bitmapData.Scan0, x * 4 + y * bitmapData.Stride); int pixel = ((int*)bitmapData.Scan0)[x + y * bitmapData.Stride / 4]; 没有区别。如果查看Marshal.ReadInt32中的代码,您将看到它使用指针执行相同的操作 封送处理的唯一“好处”是,您不必显式地允许不安全的代码。IIRC,您还
int pixel = Marshal.ReadInt32(bitmapData.Scan0, x * 4 + y * bitmapData.Stride);
int pixel = ((int*)bitmapData.Scan0)[x + y * bitmapData.Stride / 4];
没有区别。如果查看
Marshal.ReadInt32
中的代码,您将看到它使用指针执行相同的操作
封送处理的唯一“好处”是,您不必显式地允许不安全的代码。IIRC,您还需要FullTrust来运行不安全的代码,因此这可能是一个考虑因素。我个人更喜欢使用封送
,主要是因为我避免使用不安全的代码。至于哪一个更快,我不确定,但我确定逐像素操作可能会很慢,不管你怎么做。更好的方法是将整个扫描线读取到C#阵列中并进行处理。将扫描线读取到阵列中需要一个副本,该副本可能会占用更多的空间/内存/时间。@leppie实际上,将扫描线读取到阵列中会产生一个副本,该副本可能比逐像素复制花费更少的时间。谁在复制像素?通常情况下,只需对该值进行操作并将其丢弃(或移动到下一个值)。@leppie将其复制到pixel
直接对本机数组进行操作有什么问题?或者:谁说托管阵列比本机阵列快?我只是想插话说性能有差异,我相信这是由于函数调用。如果您没有执行很多编组调用,那么它是很小的,但是对于在位图上迭代,它可能相当大。