¿Un constructor de cadena constante que no asigna memoria de caracteres?
Pregunta
Estoy intentando optimizar un código que escribí para manejar varias capas de un protocolo de aplicación.Hice uso liberal del std::string
clase, y se esforzó por la simplicidad en lugar de la optimización prematura.La aplicación es demasiado lenta y valgrind & profesor muestra que estoy dedicando mucho tiempo a copiar y construir cadenas a medida que un búfer se mueve hacia arriba a través de mi pila.
Me parece que, después de copiar caracteres del búfer del sistema al búfer de mi aplicación más bajo, debería poder evitar copiar más los datos:después de todo, no muta a medida que asciende en la pila.
El formato de mi protocolo es una "transmisión", que consta de uno o más archivos terminados en nueva línea. registros, cada uno de los cuales consta de varios archivos separados por tabulaciones campos, y terminado con un token especial.P.ej.
RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n
Este se ensamblaría en un solo std::string
llamado input_buffer.
El procesamiento de una transmisión implica extraer una registro desde el búfer y pasándolo a la siguiente capa;extrayendo un vector de campos del registro y pasarlo a la siguiente capa;almacenar los campos en un mapa.En cada etapa, los datos se copian a medida que se asignan nuevas std::strings.
¿Es posible asignar una cadena constante de un índice a input_buffer y una longitud...sin que se haga ninguna copia?Por ejemplo, RECORD 2 comienza en el desplazamiento 26 y tiene 24 caracteres:
const std:string record (substr(input_buffer, 26), 24 );
No estoy familiarizado con las entrañas de un objeto de cadena, pero sus garantías de rendimiento parecen implicar que en algún lugar hay una secuencia de caracteres simple y casi indudablemente un puntero a la memoria de esos caracteres.¿Se podría inicializar ese puntero en la memoria que pertenece a otra cadena?
(Mi compilador es g++ 4.7, pero si esto es algo que requiere 4.8, también agradecería saberlo).
Solución
Por lo que tengo entendido, parece un buen candidato para impulso::string_ref.simplemente harías boost::string_ref input(input_buffer);
y luego pasar string_ref
En su lugar, está en la pila.Lo único de lo que debe preocuparse es de mantener vivo el búfer original todo el tiempo.