2012-01-03 4 views
3

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

+0

Связанный: http://stackoverflow.com/questions/8528590/what-is-the-advantage-of-using-memset-in-c – Mysticial

+1

Да, это самый быстрый. Все члены mem ... ребята быстры, потому что они понимают, как задавать слова назначения, а также байты назначения. То есть, когда, например, четыре нулевых байта должны быть перемещены в слово памяти, memset очищает ячейку памяти за один раз. В качестве бонуса memset, memmove и memcopy являются переносимыми. –

+0

'memset' установит все биты в 0, но это может быть не всегда так, как вы хотите. Вы заботитесь о переносимости? Что в массиве? –

ответ

4

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

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

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

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

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

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

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

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

+0

Платформа: Windows, Тип: float, Размер: 1e6. Кроме того, скорость работы - это первый приоритет, даже важный, чем безопасность. – Shibli

+1

@Shilbli: может быть, приведенный выше шаблон может быть еще лучше: memset устанавливает байты. мои функции устанавливают float, которые имеют одинаковый размер слова процессора. Если у компилятора есть хорошая оптимизация (стимуляция i в регистре и сохранение T() в качестве постоянной внешнего цикла), может быть даже быстрее, чем неспециализированный memset! Но это в основном зависит от компилятора, а не от библиотеки. –

+0

Это можно сделать с помощью стандартной библиотеки, используя 'std :: fill_n'. – Blastfurnace

3

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

+1

Не говоря уже о встроенных функциях, если они поддерживаются. –

+0

Для очень больших массивов 'calloc' может быть быстрее, используя возможности управления хранилищем целевой машины. Но никак не знать, не врываясь в грязные внутренние органы. –

+0

@HotLicks он сказал «существующий массив» –

Смежные вопросы