Pergunta

Eu tenho uma pergunta sobre o std :: vector.

Eu tenho um algoritmo muito intensivo de memória 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 este:

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!

Foi útil?

Solução

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.

Outras dicas

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.

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

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

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 particular?

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;
}

(Advertência: código não testado)

... reservando memória suficiente para o vetores de antecedência vai me ajudar muito com a redução do 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 tão longe como uso vai você recebe nenhum benefício.

O segundo irá usar o máximo de memória de todas as utilizações do mesmo através do loop, ou seja, o tamanho máximo de tipos de stuff_count. std::vector::clear() não necessariamente livre memória. Ou seja, se você chamar std::vector::capacity() antes e depois std::vector::clear() Uma implementação conforme norma poderia retornar o mesmo valor.

Na melhor das hipóteses, você vai reduzir o número de vezes que você alocar memória com o esquema acima. Mas você certamente não será reduzindo o consumo de memória em qualquer ponto. Se você deseja reduzir a quantidade reservada da memória, você deve usar o idioma vector swap:

std::vector<type>().swap(my_vector);
my_vector.reserve(stuff_count); 

Ou a sua primeira solução, uma vez que o efeito global será o mesmo.

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

como sobre?

std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top