Jas*_*yon 103
根据元素类型,将Array中的元素范围设置为零,to
false
或tonull
(在Visual Basic中为 Nothing).
Cha*_*hap 48
C++: memset(array, 0, array_length_in_bytes);
C++ 11: array.fill(0);
C#: Array.Clear(array, startingIndex, length);
Java的: Arrays.fill(array, value);
Dus*_*etz 16
Array.Clear(integerArray, 0, integerArray.Length);
Run Code Online (Sandbox Code Playgroud)
And*_*yWD 15
UPDATE
基于该基准关于Array.Clear()
和array[x] = default(T)
性能,我们可以说有两个主要案件零的数组时,需要考虑:
A)有一个长达1..76个项目的数组;
B)有一个长度为77或更多的数组.
因此,图上的橙色线表示Array.Clear()
方法.
图中的蓝线表示array[x] = default(T)
方法(迭代数组并将其值设置为default(T)
).
您可以写一次Helper来完成这项工作,如下所示:
public static class ArrayHelper
{
// Performance-oriented algorithm selection
public static void SelfSetToDefaults<T>(this T[] sourceArray)
{
if (sourceArray.Length <= 76)
{
for (int i = 0; i < sourceArray.Length; i++)
{
sourceArray[i] = default(T);
}
}
else { // 77+
Array.Clear(
array: sourceArray,
index: 0,
length: sourceArray.Length);
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
someArray.SelfSetToDefaults();
Run Code Online (Sandbox Code Playgroud)
Dus*_*etz 12
有几个人发布了答案,然后删除了它们,说在任何语言中,for循环将与memset或FillMemory或其他任何东西一样高效.
例如,编译器可能会将其块化为64位对齐的片段,以利用64位零分配指令(如果可用).它需要考虑对齐和考虑因素.Memset的实现肯定不是微不足道的.
一个memset.asm.另请参阅memset-is-faster-than-simple-loop.html.
永远不要低估编译器和标准库编写者的无限狡猾.
使用dll import调用方法。它快速且易于使用:)
[DllImport("msvcrt.dll", EntryPoint = "memset", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
public static extern IntPtr MemSet(IntPtr dest, int c, int byteCount);
Run Code Online (Sandbox Code Playgroud)
c是你要在内存中设置的值
或者
[DllImport("kernel32.dll", EntryPoint="RtlZeroMemory")]
public unsafe static extern bool ZeroMemory(byte* destination, int length);
Run Code Online (Sandbox Code Playgroud)
这只会将给定数组设置为零