如何快速清零数组?
我目前正在做一个for循环,我知道在C中有ZeroMemory API,但似乎并没有在C#中可用。 Java的Array.fill也不存在。 我只是想知道是否有一个更容易/更快的方式?
尝试Array.Clear() :
根据元素types,将数组中的元素范围设置为零,为
false
或null
(在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);
这只会将给定的数组设置为零