Preâmbulo para pessoas com micro-otimizadores
Lembrar:
"Os programadores perdem muito tempo pensando ou se preocupando com a velocidade das partes não críticas de seus programas, e essas tentativas de eficiência realmente têm um forte impacto negativo quando a depuração e a manutenção são consideradas. Devemos esquecer as pequenas eficiências, por exemplo, sobre 97% das vezes: a otimização prematura é a raiz de todo mal. No entanto, não devemos desperdiçar nossas oportunidades nesses 3% críticos ".
(Obrigado à metamorfose pela cotação completa)
Não use uma matriz C em vez de um vetor (ou o que seja) apenas porque você acredita que é mais rápido, pois deveria ser de nível inferior. Você estaria errado.
Use por vetor padrão (ou o contêiner seguro adaptado às suas necessidades) e, se o seu profiler disser que é um problema, veja se você pode otimizá-lo, usando um algoritmo melhor ou alterando o contêiner.
Dito isto, podemos voltar à pergunta original.
Matriz estática / dinâmica?
As classes de matriz C ++ são mais bem comportadas do que a matriz C de baixo nível, porque sabem muito sobre si mesmas e podem responder a perguntas que as matrizes C não podem. Eles são capazes de limpar depois de si mesmos. E o mais importante, eles geralmente são escritos usando modelos e / ou inlining, o que significa que o que parece muito código na depuração resolve pouco ou nenhum código produzido na criação da versão, o que significa que não há diferença com a concorrência menos segura interna.
Ao todo, ele se enquadra em duas categorias:
Matrizes dinâmicas
Usar um ponteiro para uma matriz malloc-ed / new-ed será tão rápido quanto a versão std :: vector e muito menos seguro (consulte a publicação do litb ).
Então use um std :: vector.
Matrizes estáticas
Usar uma matriz estática será, na melhor das hipóteses:
- tão rápido quanto a versão std :: array
- e muito menos seguro.
Então use um std :: array .
Memória não inicializada
Às vezes, usar um vector
buffer em vez de um buffer bruto gera um custo visível, porque o vector
inicializará o buffer na construção, enquanto o código que ele substitui não, como observou Bernie em sua resposta .
Se esse for o caso, você poderá lidar com isso usando um em unique_ptr
vez de a vector
ou, se o caso não for excepcional em sua linha de código, escreva uma classe buffer_owner
que seja a proprietária dessa memória e ofereça acesso fácil e seguro a ela, incluindo bônus como redimensioná-lo (usando realloc
?) ou o que você precisar.