Limpe vector cada iteração do loop. Qual é a maneira mais eficiente de memória?

votos
5

Eu tenho uma pergunta sobre o std :: vector.

Eu tenho uma memória algoritmo intensivo muito onde eu forsee que prevendo tamanhos vetoriais e reservando memória suficiente para os vetores com antecedência vai me ajudar muito com a redução de uso de memória.

Qual das seguintes é melhor:

for ( ... ) {
  std::vector<Type> my_vector;
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

Ou isto:

std::vector my_vector;
for ( ... ) {
  my_vector.clear();
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

Por favor me diga qual é o melhor, ou se existe uma maneira ainda melhor de fazer coisas.

Muito obrigado antecipadamente!

Publicado 06/03/2009 em 10:19
fonte usuário
Em outras línguas...                            


9 respostas

votos
5

O segundo poderia ser um pouco mais rápido, mas eu encontrar o primeiro aspirador.

Respondeu 06/03/2009 em 10:23
fonte usuário

votos
11

Com a primeira variante você realocar o buffer do vetor em cada iteração - que é geralmente muito caro. Com a segunda variante só realocar ocasionalmente. A segunda variante é melhor já que a velocidade é uma prioridade para você.

Não está claro de você questionar onde o número de elementos é saber de. Talvez você ainda pode calcular rapidamente o número máximo de elementos para todas as iterações, defina-o para ser o tamanho do buffer e não têm realocação.

Respondeu 06/03/2009 em 10:23
fonte usuário

votos
5

Como as diferenças no código são triviais, por que não testar ambas as abordagens e ver qual funciona melhor para sua aplicação específica?

Respondeu 06/03/2009 em 10:30
fonte usuário

votos
1

Depende um pouco sobre como Tipo precisa ser construído / destruído, eu diria. Se é um POD que não requer a destruição, você pode ignorar a clear (), que chama todos os destruidores em um loop, e usá-lo como uma matriz estática em vez disso:

std::vector<Type> my_vector(size);
for (...)
{
  int index = 0;
  // Do stuff
  my_vector[index] = some_value;
}

(Aviso: código não testado)

Respondeu 06/03/2009 em 10:45
fonte usuário

votos
1

... reservando memória suficiente para os vetores com antecedência vai me ajudar muito com a redução de uso de memória

err ... o quê ?! Isso não faz sentido em tudo. Reserva de memória não ajudar a reduzir o uso de memória de forma alguma. Ela impede que a necessidade de realocação constante que torna as coisas mais rápido, mas, tanto quanto o uso vai você recebe nenhum benefício.

Respondeu 06/03/2009 em 10:46
fonte usuário

votos
6

I forsee que prevendo tamanhos vetoriais e reservando memória suficiente para os vetores com antecedência vai me ajudar muito com a redução de uso de memória.

Experimente e agir como um engenheiro não uma cartomante. Criar um teste, e medir a diferença.

Respondeu 06/03/2009 em 10:57
fonte usuário

votos
0

Se você precisa fazer um monte de Anexa usar std :: deque em vez de std :: vector e usar apenas "push_back".

Respondeu 06/03/2009 em 11:17
fonte usuário

votos
0