如何快速清零数组?

我目前正在做一个for循环,我知道在C中有ZeroMemory API,但似乎并没有在C#中可用。 Java的Array.fill也不存在。 我只是想知道是否有一个更容易/更快的方式?

尝试Array.Clear() :

根据元素types,将数组中的元素范围设置为零,为falsenull (在Visual Basic中为Nothing)。

  • C ++: memset(array, 0, array_length_in_bytes);

  • C ++ 11: array.fill(0);

  • C#: Array.Clear(array, startingIndex, length);

  • Java: Arrays.fill(array, value);

 Array.Clear(integerArray, 0, integerArray.Length); 

有几个人已经发布了答案,然后删除了他们,说任何语言的循环将作为一个memset或FillMemory或任何其他同等表演。

例如,编译器可能将其分块为64位alignment块,以利用64位零分配指令(如果可用)。 这将考虑到路线和东西。 Memset的实现当然不是微不足道的。

一个memset.asm 。 另请参阅memset-is-faster-simple-loop.html 。

永远不要低估编译器和标准库编写者的无限歪曲。

你可以写一个助手做这个工作,像这样:

 public static class ArrayHelper { public static void SetToDefaults<T>(this T[] array) { for (int i = 0; i < array.Length; i++) { array[i] = default(T); } } } 

用法:

 someArray.SetToDefaults(); 

调用该方法通过使用dll import.Its快速和易于使用:)

  [DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)] public static extern IntPtr MemSet(IntPtr dest, int c, int byteCount); 

c是你想要在内存中设置的值

要么

 [DllImport("kernel32.dll", EntryPoint="RtlZeroMemory")] public unsafe static extern bool ZeroMemory(byte* destination, int length); 

这只会将给定的数组设置为零