Какой самый быстрый способ обнулить существующий массив? - PullRequest
3 голосов
/ 03 января 2012

У меня есть существующий массив 1D, memset самый быстрый способ обнулить его?

Ответы [ 2 ]

4 голосов
/ 03 января 2012

Самый быстрый ... наверное, да.Багги почти уверен!

Это в основном зависит от реализации, платформы и ... какого типа содержит массив.

В C ++, когда переменная определена, вызывается ее конструктор.Когда массив определен, вызываются все конструкторы элементов массива.

Очистка памяти может считаться «хорошей» только в тех случаях, когда известно, что тип массива имеет начальное состояние, которое может быть представленона все ноль и для которых конструктор по умолчанию не выполняет никаких действий.

Это в целом верно для встроенных типов, но также ложно для других типов.

Самый безопасный способ - присвоить элементам инициализированный временный элемент по умолчанию.

template<class T, size_t N>
void reset(T* v)
{
    for(size_t i=0; i<N; ++i) 
        v[i] = T();
}

Обратите внимание, что если T равно char, функция создается и преобразуется точно как memset.Так что это та же скорость, не больше, не меньше.

3 голосов
/ 03 января 2012

Это невозможно узнать, потому что это зависит от реализации. Тем не менее, как правило, memset будет самым быстрым, потому что разработчики библиотеки потратили много времени на его оптимизацию, чтобы он был очень быстрым, и иногда компилятор может оптимизировать его, чего нельзя сделать в реализациях, созданных вручную, потому что он знает, означает из memset.

...