Buffers de protocolo de Google y uso de std :: string para datos binarios arbitrarios

Pregunta relacionada: vector <unsigned char> vs cadena para datos binarios.

Mi código usavector<unsigned char> para datos binarios arbitrarios. Sin embargo, gran parte de mi código tiene que interactuar con el código de búfer de protocolo de Google. Las memorias intermedias de protocolo usanstd::string para datos binarios arbitrarios. Esto genera muchos ciclos de asignación / copia / libre feos solo para mover datos entre los búferes de protocolo de Google y mi código. También hace muchos casos donde necesito dos constructores (uno que toma un vector y otro una cadena) o dos funciones para convertir una función a formato de cable binario.

El código se ocupa mucho de las estructuras en bruto internamente porque las estructuras son direccionables por el contenido (almacenadas y recuperadas por hash), firmadas, etc. Por lo tanto, no se trata solo de la interfaz con los buffers de protocolo de Google. Los objetos también se manejan en forma cruda en otras partes del código.

Una cosa que podría hacer es cortar todo mi código para usarstd::string para datos binarios arbitrarios. Otra cosa que podría hacer es tratar de encontrar formas más eficientes de almacenar y recuperar mis vectores en los objetos del búfer de protocolo de Google. Supongo que mi otra opción sería crear funciones de conversión estándar, simples pero lentas a cadenas y usarlas siempre. Esto evitaría la duplicación desenfrenada de código, pero sería peor desde el punto de vista del rendimiento.

¿Alguna sugerencia? ¿Hay mejores opciones que me faltan?

Esto es lo que estoy tratando de evitar:

if(SomeCase)
{
    std::vector<unsigned char> rawObject(objectdata().size());
    memcpy(&rawObject.front(), objectdata().data(), objectdata().size());
    DoSometingWith(rawObject);
}

La asignación, copia, proceso, gratis no tiene ningún sentido cuando los datos sin procesar ya están allí.

Respuestas a la pregunta(4)

Su respuesta a la pregunta