Faz uso std::array<T, N=""> levar ao código de inchaço?[duplicado]
Pergunta
Tenho visto em alguns lugares que a recomendação de uso std::array
sobre o C-estilo de matrizes em C++, alegando que é melhor, alternativa mais segura, sem sobrecarga.Veja:
O padrão de contêiner array [...] não tem espaço de despesas gerais, além do que ele necessita para manter os seus elementos, [...].Em outras palavras, ele é muito como um built-in matriz, sem problemas.(C++11 FAQ)
No entanto, como eu a entendo, sendo um modelo de recipiente de lá vai ser uma sobrecarga na medida do tamanho do programa vai, pois irá gerar o código para cada um dos diferentes N uma matriz é instanciado com.
Suponho que meu programa usa std::array
em vários lugares, com diferentes números inteiros de N, isto vai levar a inchado código?É insignificante?
Devo preocupar-me com isso para não-modelo de tipo de parâmetros em geral?
Solução
Eu não me preocuparia com isso.Se você olhar para a interface do std::array<T, N>
, ela é muito pequena e a maioria das funções de membro (basicamente prestação de wrappers para manipulação de ponteiro) são one-liners que vai ser totalmente otimizado de distância / inlined por qualquer decente compilador no modo de edição níveis de otimização.
Além disso, você não paga por que você não usa desde que não utilizado não-virtual funções de membro (std::array<T, N>
não tem virtual
funções de membro) da classe de modelos são garantia de não ser instanciado.Pequeno cotação Padrão:
14.7.1 instância Implícita [temp.inst]
11 Uma implementação não deve implicitamente instanciar uma função modelo, uma variável de modelo, um modelo de membro, um não-membro virtual função de membro de classe, ou um membro de dados estáticos de uma classe de modelo que não necessitam de instanciação.[...]
Existem também alguns sobrecarregado operadores relacionais ==
e <
que são semanticamente equivalente a std::equal
e std::lexicographical_compare
.Na prática, estes operadores também devem ser implementados em termos de estes algoritmos (queixar-se ao seu fornecedor se eles não).
A apenas muito pequeno, preocupe-se um pouco mais de tempo de compilação sobrecarga, mas não deve ser zero de tamanho de código de tempo de execução e custos indiretos.
Relacionadas, mas não idênticas:o Relatório técnico sobre C++ Desempenho fiz um monte de cuidado parâmetros de referência em fina wrappers de classe em torno de builtin tipos (int
, double
) e encontrado perto de zero gerais para 2006 tecnologia de compilador.Você pode repetir o teste para verificar isso std::array<T,N>
vs. T[N]