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?

Foi útil?

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]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top