2013-03-30 2 views
0

Название вопроса довольно понятно. У меня есть цикл выполнения, которому нужен массив динамического размера. Но я знаю, что максимальный размер этого размера будет, поэтому при необходимости я могу максимизировать его, а не динамически - его размер.Какой самый быстрый для обнуления массив?

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

#include <iostream> 
#include <cstdlib> 
#include <cstring> 
#include <cstdio> 
#include <ctime> 

#define TEST_SIZE 1000000 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    int* arrayPtr = NULL; 
    int array[TEST_SIZE]; 
    int it = 0; 

    clock_t begin, end; 

    begin = clock(); 
    memset(array, 0, sizeof(int) * TEST_SIZE); 
    end = clock(); 
    cout << "Time to memset: "<< end - begin << endl; 

    begin = clock(); 
    fill(array, array + TEST_SIZE, 0); 
    end = clock(); 
    cout << "Time to fill: "<< end - begin << endl; 

    begin = clock(); 
    for (it = 0 ; it < TEST_SIZE ; ++ it) array[it] = 0; 
    end = clock(); 
    cout << "Time to for: "<< end - begin << endl; 
} 

Вот мой результат:

Time to memset: 1590 
Time to fill: 2334 
Time to for: 2371 

Теперь, когда я знаю, что новый & удаление делает сейчас нулевой из массива, есть ли способ быстрее, чем это?

Пожалуйста, помогите!

+1

'new' и' delete' - это не то же самое, что обнулить массив. Что именно ты пытаешься сделать? – Mysticial

+1

Я не знаю, почему профиль удаляет оператора. В любом случае новый оператор не заполняет массив 0. – Vincenzo

+0

Действительно, моя система всегда дает мне инициализированный массив из 0s. –

ответ

3

В основном вы сравниваете яблоки и апельсины.

memset и для цикла явно установить содержимое памяти к определенному значению (в вашем примере 0). В то время как new просто выделяет достаточное количество памяти (по крайней мере по запросу), а delete просто отмечает, что память не используется для повторного использования. В этой памяти нет изменений в содержимом. Таким образом, new и delete не инициализируют/де-инициализируют фактическое содержимое памяти.
Технически содержание в этой памяти имеет Неопределенное значение. В буквальном смысле ценности могут быть чем угодно, и вы не можете полагаться на них, чтобы быть чем-то конкретным. Возможно, они были 0, но они не гарантированы. Фактически использование этих значений приведет к тому, что ваша программа будет иметь Неопределенное поведение.

new вызов для класса делает две вещи:

  • Выделяет просил память &
  • вызовы конструктора для класса для инициализации объекта.

Но обратите внимание, что в вашем случае тип является int и нет инициализации по умолчанию для int.

2

new только выделяет блок памяти, он не инициализирует выделенную память. Для инициализации массива вы можете использовать memset() или сделать это вручную.

0

Хороший компилятор оптимизирует все 4 подхода в 1 вызов memset. Кроме того, в чем разница между 3 rd и 4 th подход?

Вы также можете сделать

int array[TEST_SIZE] = {}; 

усиления читаемость и сохранить 1 строку кода.

+0

на самом деле ничего, это просто с чем поиграть. –

0

Я прибегнул бы к memset в этом случае. fill является общим, но платформа может предложить вам некоторые действительно приятные трюки в реализации memset. Это возможно, потому что функция однозначна в том, что она делает и достаточно тупой:

  • Он может использовать (S) DMA для реальной модификации памяти, которая может иметь более быстрый интерфейс с памятью. Кроме того, несмотря на то, что он выполняет задачу, процессор может делать что-то еще
  • Когда он знает, что он должен последовательно записывать непрерывную область памяти, он может сделать что-то превентивное в отношении недействительности кеша
  • Реализация в встроенных системах на базе ARM может принести пользу от burst mode; он реализуется с помощью специальной команды ассемблера (STMFD, STMFA и т. д.), и в этом режиме 3 записи равны двум нормальным строкам записи
+0

Заполнение массива целых чисел должно быть реализовано через 1 memset в любом случае. – Paul

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