C ++ 14 apresenta std::dynarray
:
std :: dynarray é um contêiner de sequência que encapsula matrizes com um tamanho que é fixo na construção e não muda durante a vida útil do objeto.
std::dynarray
deve ser alocado em tempo de execução da mesma forma que std::vector
.
Então, quais são os benefícios e o uso de std::dynarray
enquanto podemos usar, std::vector
que é mais dinâmico (e também redimensionável)?
std::valarray
renomeado comostd::dynarray
? O que é dinâmicostd::dynarray
quando não pode ser redimensionado?valarray
. É dinâmico porque o comprimento da matriz é um valor de tempo de execução, não precisa ser conhecido em tempo de compilação, ao contrário destd::array
dynarray
foi removido do C ++ 14 e colocado em uma Especificação Técnica futura (pense nisso como uma nova versão do TR1) porque tem alguns problemas técnicos sérios.Respostas:
dynarray
é menor e mais simples do quevector
, porque não precisa gerenciar valores separados de tamanho e capacidade e não precisa armazenar um alocador.No entanto, o principal benefício de desempenho deve vir do fato de que as implementações são encorajadas a alocar
dynarray
na pilha quando possível, evitando qualquer alocação de heap. por exemplostd::dynarray<int> d(5); // can use stack memory for elements auto p = new std::dynarray<int>(6); // must use heap memory for elements
Essa otimização requer cooperação do compilador, não pode ser implementada como um tipo de biblioteca puro e a mágica do compilador necessária não foi implementada e ninguém tem certeza de como isso é fácil de fazer. Por causa da falta de experiência de implementação, na reunião do comitê C ++ em Chicago na semana passada, foi decidido retirar
std::dynarray
do C ++ 14 e emitir um documento separado de extensões de matriz TS (especificação técnica) definindostd::experimental::dynarray
e matrizes de limite de tempo de execução (ARBs, semelhantes para VLAs C99.) Isso significastd::dynarray
que quase certamente não estará em C ++ 14.fonte
dynarray
. Sempre pensei que você precisava de duas implementações independentes da prática existente antes que algo se tornasse elegível para padronização.dynarray
. Embora a experiência de implementação seja muito útil, não há uma regra definida exigindo-a (mas alguns diriam que deveria!)Como você mesmo disse,
std::dynarray
é para um array dinâmico de tamanho fixo . Não é redimensionável. É grosso modo uma melhoria ao longonew T[N]
e maisstd::unique_ptr<T[]>(new T[N])
.Não precisar redimensionar ou gerenciar a capacidade significa que você pode implementar a estrutura de dados com menos complexidade e em menos espaço.
Além disso,
std::dynarray
é um animal estranho que permite a implementação para implementá-lo de maneiras diferentes e não específicas, por exemplo, é possível colocar o array na pilha. Chamar uma função de alocação é "opcional". Você pode especificar um alocador para construir os elementos da matriz, mas isso não faz parte do tipo.Você também pode perguntar por que precisamos
std::dynarray
e matrizes de comprimento variável. Os VLAs em C ++ 14 são muito mais restritivos; elas podem ser apenas variáveis locais automáticas e não oferecem nenhuma maneira de especificar uma política de alocação e, claro, não têm uma interface de contêiner padrão.Alguns exemplos de 23.3.4.2 de um "rascunho atual" (veja isso, cache do Google):
Se você ou não pode usar um determinado alocador para construir os elementos da matriz, é uma característica global:
Edit: A resposta de Jonathan Wakely tende a ser muito mais confiável e perspicaz.
fonte
dynarray
o construtor de nunca é usado para alocação, é usado apenas como um argumento para os construtores dos elementos (usando "construção usa-alocador"). É por isso que você não pode consultar se o alocador foi usado: porque nunca é.