Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Marshal.ReadInt32等与不安全上下文和指针有何不同?_C#_.net_Unmanaged - Fatal编程技术网

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
直接对本机数组进行操作有什么问题?或者:谁说托管阵列比本机阵列快?我只是想插话说性能有差异,我相信这是由于函数调用。如果您没有执行很多编组调用,那么它是很小的,但是对于在位图上迭代,它可能相当大。