c++ - Uso de impulso en el sistema integrado con limitación de memoria
boost embedded (6)
Boost es un conjunto de bibliotecas. Algunos de ellos se centran en la metaprogramación de plantillas. Esos ni siquiera usan memoria en tiempo de ejecución. Pero su pregunta parece ser sobre reemplazar sus contenedores. Dudo que sea posible, excepto el uso de asignadores personalizados. Pero incluso entonces, lo más probable es que use contenedores simples STL y no aumente. Boost solo proporciona los contenedores TR1, para aquellos compiladores que aún no incluyen TR1.
Estamos utilizando c ++ para desarrollar una aplicación que se ejecuta en Windows CE 4 en un sistema integrado.
Una de nuestras limitaciones es que toda la memoria utilizada por la aplicación se asignará solo durante el inicio . Escribimos muchos contenedores y algoritmos que usan solo memoria preasignada en lugar de asignar una nueva.
¿Cree que es posible para nosotros utilizar las bibliotecas de impulso en lugar de nuestros propios contenedores en estas condiciones?
¡Cualquier comentario y / o consejo son bienvenidos!
Muchas gracias,
Nic
No use Boost.
Es una gran biblioteca y sus requisitos básicos de asignación de memoria son muy diferentes de los de los diseñadores de bibliotecas.
Incluso si puede obtener una versión actual de Boost para que funcione de acuerdo con sus requisitos con asignadores personalizados, puede romperse con una nueva versión de Boost.
No dude en consultar el código fuente de Boost para obtener algunas ideas útiles, pero use su propia implementación para lo que necesita.
Puede escribir su propio asignador para el contenedor, que se asigna desde un buffer estático de tamaño fijo. Dependiendo de los patrones de uso del contenedor, el asignador podría ser tan simple como incrementar un puntero (por ejemplo, cuando solo inserta cosas en el contenedor una vez que se inicia la aplicación, y no agrega / elimina elementos continuamente).
Reemplazar sus contenedores con contenedores Boost NO es una buena idea. El trabajo para hacer asignadores personalizados apropiados no sería tan malo, pero estarías violando el espíritu de tu regla ''asignar al inicio''. La idea detrás de esta regla (en mi experiencia) generalmente es asegurarse de que no tenga que lidiar con situaciones sin memoria en tiempo de ejecución. La idea es asegurarse de tener toda la memoria que pueda necesitar, DERECHA AL INICIO, de modo que no haya posibilidad de que una parte del sistema quede sin memoria más adelante.
Si utilizó los contenedores de Boost con un asignador personalizado, de repente tendría que lidiar con la posibilidad de que el grupo desde el que se está distribuyendo el contenedor podría quedar vacío, eliminando así el propósito de la regla ''asignar al inicio''.
En la situación de un dispositivo de memoria limitado, evitaría cualquier tipo de contenedor más complejo que una matriz estáticamente asignada.
Usamos impulso para sistemas integrados . Con impulso puede elegir y elegir lo que usa. Usamos smart_ptr
y boost::bind
en todos nuestros proyectos. Escribimos software para teléfonos celulares baratos . Y si Windows CE se puede ejecutar en su hardware, esperaría que partes de boost fueran aplicables. Hay partes de boost que no tienen asignaciones y puede que las encuentren útiles.
Escogería y elegiría según sus requisitos.
Como todo lo que usa, necesita saber los costos.
Estoy investigando esto en este momento: me gustaría utilizar almacenamientos intermedios circulares, contenedores sin bloqueo y E / S asíncrona, y en lugar de asignar memoria dinámica, preferiría usar grupos de memoria.
El mayor problema que he visto hasta ahora es que shared_ptr
se usa en muchos lugares, sin una forma fácil de reemplazarlo con intrusive_ptr
. Dado que shared_ptr
asigna memoria dinámica para realizar un seguimiento del recuento de referencias, no puedo usarlo en un sistema integrado.
La solución parece factible, pero shared_ptr
mucho trabajo. Debo expandir la especificación de plantilla de cualquier clase que contenga un shared_ptr
para que el tipo específico de puntero compartido se pueda cambiar a intrusive_ptr
si así lo desea. Así que ahora tengo que considerar cuánto trabajo va a hacer, en comparación con la cantidad de trabajo que será para escribir mi propia versión de las características de Boost que necesito. No es un lugar agradable para estar.
Espero que alguien señale por qué estoy equivocado acerca de esto.