Um construtor de string const que não aloca memória char?
Pergunta
Estou tentando otimizar algum código que escrevi para lidar com várias camadas de um protocolo de aplicativo.Fiz uso liberal do std::string
classe e buscou a simplicidade em vez da otimização prematura.O aplicativo é muito lento e valgrind & gprof mostre que estou gastando um tempo significativo na construção de strings à medida que um buffer sobe na minha pilha.
Parece-me que, depois de copiar caracteres do buffer do sistema para o buffer de aplicativo mais baixo, devo evitar mais copiar os dados:afinal, ele não sofre mutação à medida que sobe na pilha.
Meu formato de protocolo é uma "transmissão", que consiste em uma ou mais terminadas em nova linha registros, cada um consistindo em vários separados por tabulação Campos, e encerrado com um token especial.Por exemplo.
RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n
Este seria montado em um único std::string
chamado input_buffer.
O processamento de uma transmissão envolve a extração de um registro do buffer e passando para a próxima camada;extraindo um vetor de Campos do registro e passando para a próxima camada;armazenando os campos em um mapa.Em cada estágio, os dados são copiados à medida que novas std::strings são alocadas.
É possível alocar uma string const de um índice em input_buffer e um comprimento ...sem que nenhuma cópia seja feita?Por exemplo, RECORD 2 começa no deslocamento 26 e tem 24 caracteres:
const std:string record (substr(input_buffer, 26), 24 );
Não estou familiarizado com as entranhas de um objeto string, mas suas garantias de desempenho parecem implicar que em algum lugar existe uma sequência simples de caracteres e quase sem dúvida um ponteiro para a memória desses caracteres.Esse ponteiro poderia ser inicializado na memória pertencente a outra string?
(Meu compilador é g++ 4.7, mas se isso requer algo que requer 4.8, eu gostaria de saber disso também.)
Solução
Pelo que entendi, parece um bom candidato para impulso::string_ref.Você simplesmente faria boost::string_ref input(input_buffer);
e depois passar string_ref
em vez disso, aumente a pilha.A única coisa com que você precisa se preocupar é manter o buffer original ativo o tempo todo.