Pergunta

No que se refere ao artigo Gotw 54 por Herb Sutter, ele explica sobre

  1. The Right Way To "Shrink-To-Fit", um vector ou deque e

  2. O caminho certo para limpar completamente um vetor ou deque

Podemos usar apenas container.resize() e container.clear() para a tarefa acima ou estou faltando alguma coisa?

Foi útil?

Solução

Há duas coisas diferentes que um vetor detém: size Vs capacity. Se você apenas resize o vector, não há garantia de que a capacidade (quanta memória é reservada) deve mudar. resize é uma operação em causa com o quanto você está usando, não quanto a capacidade vetor é.

Assim, por exemplo.

size     == how much you are using
capacity == how much memory is reserved
vector<int> v(10);

v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear()    // size == 0 but capacity (may or may) not be changed

No final, a capacidade não deve alterado a cada operação, porque isso iria trazer um monte de alocação de memória / sobrecarga deallocation. Ele está dizendo que se você precisar " deallocate " memória reservada por vetor, fazer isso.

Outras dicas

Nem redimensionamento () nem clear () trabalho. O .capacity() de um vector é garantida para ser pelo menos tão grande quanto o size() atual do vetor, e garantido para ser pelo menos tão grande como a capacidade reserve()d. Além disso, este .capacity() não encolher, por isso também é pelo menos tão grande como qualquer size() anterior ou reserve()ation.

Agora, a .capacity() de um vector é apenas a memória que ele tem reservado. Muitas vezes, nem todos que cotains memória objetos. Redimensionar Remove objetos, mas não reciclar a memória. Um vector só pode reciclar o seu buffer de memória ao alocar um buffer maior.

O truque troca funciona copiando todos ojects a um buffer de memória menor, mais apropriado. Em seguida, o buffer de memória original pode ser reciclado. Este parece violar a afirmação anterior de que o buffer de memória de um vector só pode crescer. No entanto, com o truque swap, você tem temporariamente 2 vetores.

O vector tem tamanho e capacidade. Pode segurar elementos X, mas têm memória não inicializada na loja para elementos Y mais. Em um apagamento implementação típica, redimensionamento (ao redimensionar para o tamanho menor) e claro não afetam a capacidade:. O vector mantém a memória em torno de si mesmo, se você quiser adicionar novos itens a ele em um momento posterior

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top