2011-03-24 16 views
8

¿Alguien sabe si hay una clase de cadena compatible con la interfaz STL que asigna memoria para cadenas pequeñas en la pila (hasta un cierto umbral) y el montón para cadenas más grandes?Clase de cadena asignada en pila para cadenas pequeñas?

Estoy buscando optimizar un programa y estoy usando un montón de pequeñas cadenas locales que fácilmente podrían caber en la pila, en lugar de asignarse en el montón.

+2

Visual Studio tiene esta optimización (para cadena muy pequeña, solo un par de caracteres) mientras que gcc prefirió Copy-On-Write. –

+0

Usamos Visual Studio 2010, ¿hay algún lugar donde pueda leer sobre esta optimización (MSDN o en otro lugar)? – ROAR

+1

La mayoría de los compiladores lo harán, si tiene una versión reciente suficiente. –

Respuesta

1

Puede proporcionar un asignador personalizado para std::basic_string (es el tercer argumento de la plantilla). This answer explica cómo usar eso y se vincula a una implementación de un apilador de pila que se puede usar.

+4

Algunas implementaciones de std :: string hacen esto, se llama optimización de cadenas pequeñas. Un google rápido debería decirle si el suyo sí o si hay una alternativa que pueda usar. – Pete

1

La implementación de vstring (__versa_string) de gcc puede hacer la optimización de cadena pequeña y tiene una interfaz de cadena estándar. Si está usando gcc, es bastante fácil incluir ext/vstring. De lo contrario, puede adaptarlo a su compilador/entorno.

0

__versa_string La versión de SSO no puede almacenar más de 15 bytes en la pila y, si lo hace, reserva 16 bytes independientemente del tamaño de la cadena (http://codepad.org/2M7N9cTu).

http://www.and.org/ustr/ puede reutilizar un buffer de pila, pero tuve problemas para vincularlo con Debian Wheezy 64bit.

http://freecode.com/projects/str-class puede reutilizar un almacenamiento intermedio de pila.

escribí una clase string sólo de encabezado que utiliza sólo cuatro bytes y se puede volver a utilizar un búfer de pila: http://code.google.com/p/libglim/source/browse/trunk/gstring.hpp
Tiene una compatibilidad limitada STL: basic_streambuf implementado para su uso con std :: ostream.

1

Esta es una pregunta antigua, pero creo que es mejor que cualquiera de las respuestas actuales.

http://llvm.org/docs/ProgrammersManual.html#dss_smallstring

Básicamente es lo que desea. BTW tcmalloc aumentó el rendimiento en mi (mal diseñado: D) programa intensivo de alloc de cuerdas 10%. También debe perfil para probar los allocs son su problema de rendimiento.

Cuestiones relacionadas