В настоящее время я делаю это в цикле for, и я знаю, что на C существует API ZeroMemory, однако это не похоже на С#. Также не существует несколько эквивалентных Array.fill из Java. Мне просто интересно, есть ли более простой/быстрый способ?
Как быстро обнулить массив?
Ответ 1
Попробуйте Array.Clear():
Устанавливает диапазон элементов в массиве до нуля, до
false
илиnull
(Ничего в Visual Basic), в зависимости от по типу элемента.
Ответ 2
-
С++:
memset(array, 0, array_length_in_bytes);
-
С++ 11:
array.fill(0);
-
С#:
Array.Clear(array, startingIndex, length);
-
Java:
Arrays.fill(array, value);
Ответ 3
Array.Clear(integerArray, 0, integerArray.Length);
Ответ 4
Несколько человек разместили ответы, а затем удалили их, указав, что на любом языке цикл for будет в равной степени исполняться как memset или FillMemory или что-то еще.
Например, компилятор может вырезать его в 64-разрядные выровненные фрагменты, чтобы воспользоваться 64-разрядной командой присваивания нуля, если она доступна. При этом учитывается согласование и прочее. Внедрение Memset, конечно, не тривиально.
one memset.asm. Также см. memset-is-faster-than-simple-loop.html.
Никогда не недооценивайте бесконечную склонность компилятора и стандартных библиотек.
Ответ 5
Вы можете написать один раз Помощник для выполнения этой задачи, например:
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();
Ответ 6
Вызов метода с помощью dll import.It быстрый и простой в использовании:)
[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);
это только задает заданный массив нулю