Por que não redimensionar e obras claras em GotW 54?
Pergunta
No que se refere ao artigo Gotw 54 por Herb Sutter, ele explica sobre
-
The Right Way To "Shrink-To-Fit", um vector ou deque e
-
O caminho certo para limpar completamente um vetor ou deque
Podemos usar apenas
container.resize()
econtainer.clear()
para a tarefa acima ou estou faltando alguma coisa?
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