Tengo una pregunta muy similar astd :: string con ninguna tienda libre de asignación de memoria
How do I allocate a std::string on the stack using glibc's string implementation?
pero creo que vale la pena preguntar de nuevo.
Quiero un std::string
con almacenamiento local que se desborda en la tienda gratuita. std::basic_string
proporciona un asignador como un parámetro de plantilla, así que parece que lo que hay que hacer es escribir un asignador de almacenamiento local y lo utilizan para parametrizar el basic_string
, así:
std::basic_string<
char,
std::char_traits<char>,
inline_allocator<char, 10>
>
x("test");
Traté de escribir la clase inline_allocator
eso funcionaría de la manera esperada: reserva 10 bytes para el almacenamiento, y si el basic_string
necesita más de 10 bytes, llama al ::operator new()
. No pude hacer que funcione. En el curso de la ejecución de la línea de código anterior, mi biblioteca de cadenas estándar GCC 4.5 llama al constructor de copia para inline_allocator
4 veces. No es claro para mí que haya una forma sensata de escribir el constructor de copia para inline_allocator
.
En el otro hilo StackOverflow, Eric melski proporcionan este enlace a una clase de Cromo:
http://src.chromium.org/svn/trunk/src/base/stack_container.h
lo cual es interesante, pero no es una gota en el reemplazo para std::string
, ya que envuelve el std::basic_string
en un contenedor para que tenga que llamar a un operator->()
sobrecargado para obtener el std::basic_string
.
No puedo encontrar ninguna otra solución a este problema. ¿Podría ser que no hay una buena solución? Y si eso es cierto, ¿los conceptos std::basic_string
y std::allocator
son muy defectuosos? Quiero decir, parece que este debería ser un caso de uso muy simple y básico para std::basic_string
y std::allocator
. Supongo que el concepto std::allocator
está diseñado principalmente para piscinas, pero creo que debería cubrir esto también.
Parece que la semántica movimiento rvalue de referencia en C++ 0x podría hacer posible la escritura de inline_allocator
, si la biblioteca de cadena se re-escrito para que basic_string
utiliza el constructor de su movimiento asignador en lugar del constructor de copia. ¿Alguien sabe cuál es la perspectiva para ese resultado?
Mi aplicación necesita construir un millón de pequeñas cadenas ASCII por segundo, así que terminé escribiendo mi propia clase de cadena de longitud fija basada en Boost.Array
, que funciona bien, pero esto todavía me molesta.
Interesante pregunta, +1. –
Como alguien que ha luchado con asignadores personalizados en el pasado, estoy muy interesado en escuchar a una autoridad hablar sobre este tema. –
+1 para "tienda gratis". Ah, y porque es una buena pregunta. –