2008-10-03 22 views
8

Estamos utilizando C++ para desarrollar una aplicación que se ejecute en Windows CE 4 en un sistema integrado.Uso del refuerzo en el sistema integrado con limitación de memoria

Una de nuestras limitaciones es que toda la memoria utilizada por la aplicación se asignará durante el inicio solo. 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?

¡Todos los comentarios y/o consejos son bienvenidos!

Muchas gracias,

Nic

+0

Como han señalado algunas respuestas, Boost es un conjunto de muchas bibliotecas, cada una de las cuales, en general, se puede usar por separado. Puede obtener respuestas más útiles si puede especificar qué partes de Boost está considerando. – jwfearn

Respuesta

6

Se puede escribir su propio asignador para el contenedor, que asigna un búfer de tamaño fijo estática. Dependiendo de los patrones de uso del contenedor, el asignador podría ser tan simple como incrementar un puntero (ej. Cuando solo inserta cosas en el contenedor una vez al inicio de la aplicación, y no agrega/elimina elementos continuamente).

+0

En mi experiencia, algunas bibliotecas de Boost usarán un asignador de estilo STL especificado por el usuario y otras no. Algunos permiten la asignación de memoria definida por el usuario usando alguna otra API. Y sospecho que algunos incluso hacen todo lo anterior. Lamentablemente, aún no he encontrado una lista confiable de cuál es cuál. – jwfearn

1

Boost is 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.

0

No utilice 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.

+0

Las nuevas versiones de Boost no romperán necesariamente los asignadores proporcionados por el usuario. Desafortunadamente, esto depende totalmente de la variedad de bibliotecas de Boost de las que estamos hablando y, en su caso, de API que utilizan para la asignación definida por el usuario. – jwfearn

11

Utilizamos boost 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 asignación y puede que las encuentres útiles.

Me gustaría elegir y elegir según sus necesidades.

Como cualquier cosa que use, necesita conocer los costos.

+0

¿Cuáles son las limitaciones de memoria de esos teléfonos baratos? –

+2

Recientemente utilicé boost en un micro MSP430 con 6K de RAM y 64K de flash. Solo elija y elija. – Ted

1

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 usó los contenedores Boost con un asignador personalizado, de repente tendría que lidiar con la posibilidad de que el grupo desde el que se destina 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.

0

Estoy investigando esto ahora mismo — Me gustaría utilizar almacenamientos intermedios circulares, contenedores sin cerradura y E/S asincrónicas, y en lugar de asignar memoria dinámica, preferiría utilizar grupos de memoria.

El mayor problema que he visto hasta ahora es que shared_ptr se utiliza en muchos lugares, sin una forma fácil de reemplazarlo por 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 fijación de este parece factible, pero mucho trabajo — que tenga que ampliar la plantilla de especificación de cualquier clase que contiene un shared_ptr de manera que el tipo específico de triple compartida se puede cambiar a intrusive_ptr si se 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.

Cuestiones relacionadas