Pregunta

Estamos utilizando c ++ para desarrollar una aplicación que se ejecuta en Windows CE 4 en un sistema integrado.

Una de nuestras restricciones es que toda la memoria utilizada por la aplicación se asignará durante solo inicio . Escribimos muchos contenedores y algoritmos que usan solo memoria preasignada en lugar de asignar una nueva.

¿Cree que es posible que usemos las bibliotecas boost en lugar de nuestros propios contenedores en estas condiciones?

¡Cualquier comentario y / o consejo son bienvenidos!

Muchas gracias

Nic

¿Fue útil?

Solución

Podría escribir su propio asignador para el contenedor, que se asigna desde un búfer 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 al inicio de la aplicación y no agrega / elimina elementos continuamente).

Otros consejos

Usamos boost para sistemas integrados . Con el impulso, puede seleccionar 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 puede ejecutarse en su hardware, esperaría que se aplicaran partes de impulso . Hay partes de impulso que no tienen asignación y puede que te resulten útiles.

Elegiría y elegiría en función de tus requisitos.

Al igual que cualquier cosa que use, debe conocer los costos.

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ía violando el espíritu de su regla de "asignar al inicio". La idea detrás de esta regla (en mi experiencia) generalmente es asegurarse de que no tenga que lidiar con situaciones fuera del tipo de memoria en tiempo de ejecución. La idea es asegurarse de tener toda la memoria que pueda necesitar A LA DERECHA DE INICIO, de modo que no haya posibilidad de que alguna parte del sistema se quede sin memoria más adelante.

Si usó los contenedores Boost con un asignador personalizado, de repente tendría que lidiar con la posibilidad de que la agrupación a la que se asigna el contenedor pudiera quedar vacía, eliminando así el propósito de la regla de "asignar al inicio". / p>

En la situación de un dispositivo de memoria limitado, evitaría cualquier tipo de contenedor más complejo que una matriz asignada estáticamente.

Boost es un conjunto de bibliotecas. Algunos de ellos se centran en la metaprogramación de plantillas. Esos ni siquiera usan ninguna memoria en tiempo de ejecución. Pero su pregunta parece ser acerca de reemplazar sus contenedores. Dudo que sea posible, excepto el uso de asignadores personalizados. Pero incluso entonces, lo más probable es que esté utilizando contenedores STL simples y no un impulso. Boost solo proporciona los contenedores TR1, para aquellos compiladores que aún no incluyen TR1.

No uses 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 hacer que una versión actual de Boost funcione de acuerdo con sus requisitos con asignadores personalizados, puede romperse con una nueva versión de Boost.

Siéntase libre de mirar el código fuente de Boost para algunas ideas útiles, pero use su propia implementación para lo que necesita.

Estoy investigando esto ahora & # 8212; Me gustaría usar búferes circulares, contenedores sin bloqueo y E / S asíncronas, y en lugar de asignar memoria dinámica, prefiero usar grupos de memoria.

El mayor problema que he visto hasta ahora es que shared_ptr se usa en muchos lugares, sin una manera fácil de reemplazarlo con intrusive_ptr . Como shared_ptr asigna memoria dinámica para realizar un seguimiento del recuento de referencias, no puedo usarlo en un sistema integrado.

Arreglar esto parece factible, pero mucho trabajo & # 8212; Tengo que expandir la especificación de plantilla de cualquier clase que contenga un shared_ptr para que el tipo específico de puntero compartido pueda cambiarse a intrusive_ptr si lo desea. Así que ahora tengo que considerar cuánto trabajo será, en comparación con cuánto trabajo será 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 sobre esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top