Tengo el origen para una biblioteca grande (> 250 archivos) que hace un uso intensivo de contenedores y cadenas STL. Necesito ejecutarlo en un entorno incrustado con un montón limitado, por lo que quiero asegurarme de que esta biblioteca en sí misma esté limitada en su uso de almacenamiento dinámico.Reemplazar el asignador STL predeterminado
La solución obvia es crear un asignador, pero modificar todo el código base para incluir el parámetro de plantilla del asignador es un gran trabajo de último recurso, y no deseable en caso de que quiera tomar una nueva versión de la fuente. Reemplazar globalmente nuevo y eliminar no es factible ya que afecta la imagen completa, no solo esta biblioteca.
Mi siguiente pensamiento fue un estúpido truco macro C, pero parece que no sería posible, aunque admito que no soy un macro autor inteligente.
Así que pensé "¿hay un compilador o un modificador pragma para especificar el asignador <> clase en tiempo de compilación"? Pero estoy abierto para cualquier cosa.
La siguiente pregunta que haré, si alguien puede encontrar una solución, es cómo hacer lo mismo para nuevo/eliminar dentro del conjunto de archivos que componen esta biblioteca.
Estoy usando el toolchain gcc 3.4.4 para ejecutar esto bajo Cygwin, con un objetivo de VxWorks, si eso genera alguna idea.
gcc 3.4.4 Eso es lo suficientemente viejo como para ser etiquetado como "completamente roto". ¿Alguna razón por la que no cambias a una versión más nueva? – sehe
Creo que en GCC eso es solo una simple macro en algún lugar de la red interna, que deberías poder cambiar. El valor predeterminado es el "nuevo asignador", pero GCC viene con varias alternativas, como el "asignador malloc" y un asignador de grupo y otras cosas. –
Supongamos que puede crear un montón limitado y luego sobrecargar 'operator new' solo para esta biblioteca, por lo que todas las llamadas' operator new' en la biblioteca fueron a su montón limitado. ¿Qué comportamiento quieres cuando el montón limitado está lleno y se llama al sobrecargado 'operator new'? ¿Realmente querrías que fallara el 'operador nuevo' en esas circunstancias? No creo que lo haría, a menos que esa biblioteca todavía pueda funcionar cuando 'operator new' está fallando. Tal vez si la biblioteca es un caché de base de datos, o algo así. ¿Qué hace la biblioteca? –