Подтвердить что ты не робот

Как быстро обнулить массив?

В настоящее время я делаю это в цикле for, и я знаю, что на C существует API ZeroMemory, однако это не похоже на С#. Также не существует несколько эквивалентных Array.fill из Java. Мне просто интересно, есть ли более простой/быстрый способ?

4b9b3361

Ответ 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);

это только задает заданный массив нулю