Há uma novidade std::inplace_vector
na biblioteca padrão C++ que parece ter uma capacidade fixa definida em tempo de compilação. Estou tentando entender um caso de uso para std::inplace_vector
instead of std::array
or std::vector
. Parece que std::inplace_vector
tem a vantagem de uma capacidade de tamanho fixo , como std::array
, mas em vez disso não requer inicialização de objeto até a inserção. Mas, diferentemente de std::vector
, std::inplace_vector
tem uma capacidade de tempo de compilação fixa.
Alguém pode dar um exemplo de onde std::inplace_vector
isso pode ser útil?
std::array
requer que o tipo de elemento seja construível por padrão se você construir o array por padrãostd::inplace_vector
por outro lado não, pois a construção padrão não cria objetos no vetorIsso também significa que você pode usar um loop para inicializar os membros do ,
inplace_vector
enquanto não pode com umstd::array
.Também apontado por @Quimby
std::inplace_vector
fornece um contêiner redimensionável , que evita completamente alocações de memória .Este tipo é útil como um contêiner local rápido , desde que:
std::inplace_vector :
Essa parte é semelhante à da maioria dos std::vectors (o vetor de bool pode ser diferente)
Isso pode ser bem útil se você lida com uma C-Library onde você fornece arrays de tamanho variável que têm um limite superior, o limite pode ser definido pela biblioteca, talvez definido pelo seu caso de uso.
Eu acho que algo que se parece e se comporta como um std::vector é muito mais agradável de usar do que um velho C-array simples com uma variável de tamanho separada.
Em um std::vector é fácil esquecer de fazer
reserve()
corretamente, o que pode levar a ponteiros inválidos ou apenas pior desempenho.Com um std::inplace_vector o compilador força você a pensar sobre a memória reservada e em vez de ponteiros inválidos difíceis de detectar você notará o erro no
push_back()
qual tenta exceder o tamanho máximo.Então em alguns casos pode evitar que você cometa erros.
Os elementos de std::inplace_vector são armazenados como membros diretos do objeto e, portanto, potencialmente na pilha.
Cuidado com tamanhos grandes em variáveis locais, a pilha é tipicamente muito menor que o heap.