Existem limitações práticas para usar apenas std :: string em vez de matrizes de caracteres e std :: vector / lista em vez de matrizes em C ++?

StackOverflow https://stackoverflow.com/questions/801385

Pergunta

vetores eu uso, listas, cordas e wstrings obsessivamente no meu código. Há algum 22s de captura envolvido que deve tornar-me mais interessado em usar matrizes de tempos em tempos, caracteres e wchars vez?

Basicamente, se trabalhar em um ambiente que suporta a biblioteca modelo padrão há qualquer caso, utilizando os tipos primitivos é realmente melhor?

Foi útil?

Solução

Para 99% do tempo e 99% das implementações de biblioteca padrão, você vai achar que std :: vetores vai ser rápido o suficiente, e a conveniência e segurança que você começa de usá-los mais do que superam qualquer custo de desempenho pequeno.

Para os casos muito raros quando você realmente precisa bare-metal do código, você pode tratar um vetor como uma matriz de estilo C:

vector <int> v( 100 );
int * p = &v[0];
p[3] = 42;

A C ++ garantias padrão que vetores são alocados de forma contígua, de modo que este é garantido que funcione.

Em relação cordas, o fator de conveniência se torna almnost esmagadora, e os problemas de desempenho tendem a ir embora. Se você vai beack para cadeias de estilo C, que também estão voltando para o uso de funções como strlen (), que são inerentemente muito ineficiente si mesmos.

Quanto listas, você deve pensar duas vezes, e provavelmente três vezes, antes de usá-los em tudo, se a sua própria implementação ou o padrão. A grande maioria dos problemas de computação são melhor resolvidos utilizando um vector / matriz. As listas razão aparecem tantas vezes na literatura é, em grande parte porque eles são uma estrutura de dados conveniente para livros didáticos e curso de formação escritores de usar para explicar ponteiros e alocação dinâmica de uma só vez. Eu falo aqui como um escritor curso de treinamento ex.

Outras dicas

eu iria ficar para classes STL (vetores, cordas, etc). Eles são mais seguros, mais fácil de usar, mais produtivo, com menos probabilidade de ter vazamentos de memória e, AFAIK, eles fazem alguns, em tempo de execução adicional verificação de limites, pelo menos em tempo de debug (Visual C ++).

Em seguida, medir o desempenho. Se você identificar o gargalo (s) está em classes STL, em seguida, passar para cadeias de estilo C e uso de arrays.

Da minha experiência, as chances de ter o gargalo no vector ou uso cordas são muito baixos.

Um problema é a sobrecarga ao acessar elementos. Mesmo com vector e corda quando você acessar um elemento pelo índice, você precisa primeiro recuperar o endereço do buffer, em seguida, adicione o deslocamento (você não fazê-lo manualmente, mas o compilador emite esse código). Com variedade crua você já tem o endereço de buffer. Este engano extra pode levar a uma sobrecarga significativa em determinados casos e está sujeita a criação de perfil quando você quiser melhorar o desempenho.

Se você não precisa de respostas em tempo real, ficar com sua abordagem. Eles são mais seguros do que caracteres.

Você pode ocasionalmente encontrar cenários onde você poderá obter um melhor uso do desempenho ou memória de fazer algumas coisas sozinho (exemplo, std :: string normalmente tem cerca de 24 bytes de sobrecarga, 12 bytes para os ponteiros no std :: string em si e um bloco de cabeçalho no seu pedaço alocada dinamicamente).

Eu tenho trabalhado em projectos onde a conversão de std :: string para const char * memória perceptível salvo (10 dos MB). Eu não acredito que esses projetos são o que você chamaria típico.

Oh, usando STL vai machucar os tempos de compilação, e em algum ponto que pode ser um problema. Quando os resultados do projeto em mais de um GB de arquivos objeto que está sendo passado para o vinculador, você pode querer considerar como muito do que é modelo de inchaço.

Eu já trabalhei em vários projetos, onde a sobrecarga de memória para cordas tornou-se problemática.

Vale a pena considerar de antemão como o seu aplicativo precisa escala. Se você precisa estar armazenando um número ilimitado de cordas, usando const char*s em uma tabela de cadeia com gestão global pode poupar enormes quantidades de memória.

Mas, geralmente, definitivamente usar tipos de STL a menos que haja uma boa razão para fazer o contrário.

Eu acredito que a técnica de alocação de memória padrão é um tampão para vetores e strings é aquele que atribui o dobro da quantidade de memória cada vez que a memória alocada atualmente é consumido. Isso pode ser um desperdício. Você pode fornecer um alocador de costume, é claro ...

A outra coisa a considerar é amontoado vs. pilha. Staticly matrizes de tamanho e cordas pode sentar-se na pilha, ou pelo menos o compilador trata o gerenciamento de memória para você. compiladores mais recentes irá lidar com matrizes de tamanho dinamicamente para você também se eles fornecem a / C ++ 0x recurso C99 relevante. Vetores e strings sempre usará o montão, e isso pode apresentar problemas de desempenho se você tiver restrições muito apertadas.

Como uma regra de que é Use o polegar já está lá, a menos que dói seu projeto com sua sobrecarga velocidade / memória ... você provavelmente vai descobrir que para 99% das coisas da STL desde aulas de poupar tempo e esforço com pouca ou nenhuma impacto no seu desempenho aplicações. (Isto é "evitar optimização prematura")

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