Utilisation de boost dans un système embarqué avec limitation de mémoire

Nous utilisons c ++ pour développer une application qui s’exécute dans Windows CE 4 sur un système intégré.

L’une de nos contraintes est que toute la mémoire utilisée par l’application doit être allouée au démarrage uniquement . Nous avons écrit de nombreux conteneurs et algorithmes qui utilisent uniquement de la mémoire préallouée au lieu d’en allouer un nouveau.

Pensez-vous qu’il soit possible d’utiliser les librairies boost au lieu de nos propres conteneurs dans ces conditions?

Tous les commentaires et / ou conseils sont les bienvenus!

Merci beaucoup,

Nic

Vous pouvez écrire votre propre allocateur pour le conteneur, qui l’alloue à partir d’un tampon statique de taille fixe. En fonction des modèles d’utilisation du conteneur, l’allocateur peut être aussi simple qu’incrémenter un pointeur (par exemple, lorsque vous insérez uniquement des éléments dans le conteneur une fois au démarrage de l’application, sans append / supprimer d’éléments en permanence.)

Nous utilisons boost pour les systèmes embarqués . Avec boost, vous pouvez choisir ce que vous utilisez. Nous utilisons smart_ptr et boost::bind dans tous nos projets. Nous écrivons des logiciels pour les téléphones portables bon marché . Et si Windows CE peut fonctionner sur votre matériel, je m’attendrais à ce que des parties de boost soient applicables. Certaines parties de boost ne sont pas affectées et peuvent vous être utiles.

Je choisirais en fonction de vos besoins.

Comme pour tout ce que vous utilisez, vous devez connaître les coûts.

Remplacer vos conteneurs par des conteneurs Boost n’est pas une bonne idée. Il ne serait pas si difficile de créer des allocateurs personnalisés appropriés, mais vous violeriez l’esprit de votre règle d’allocation au démarrage. Selon mon expérience, cette règle a pour principe de ne pas avoir à faire face à des situations de type mémoire insuffisante au moment de l’exécution. L’idée est de vous assurer que vous avez toute la mémoire dont vous pourriez avoir besoin DROITE AU DÉPART, afin d’éviter toute possibilité qu’une partie du système manque de mémoire plus tard.

Si vous utilisiez les conteneurs Boost avec un allocateur personnalisé, vous auriez soudainement à gérer la possibilité que le pool à partir duquel le conteneur est alloué devienne vide, éliminant ainsi le but de la règle ‘atsortingbuer au démarrage’.

Dans le cas d’un périphérique à mémoire limitée, j’éviterais tout type de conteneur plus complexe qu’un tableau alloué statiquement.

Boost est un ensemble de bibliothèques. Certains d’entre eux sont axés sur la métaprogrammation de modèles. Ceux-ci n’utilisent même pas de mémoire au moment de l’exécution. Mais votre question semble concerner le remplacement de vos conteneurs. Je doute que ce soit possible sauf en utilisant des allocateurs personnalisés. Mais même dans ce cas, il est fort probable que vous utilisiez des conteneurs STL ordinaires sans booster. Boost fournit uniquement les conteneurs TR1, pour les compilateurs qui n’incluent pas encore TR1.

Ne pas utiliser Boost.

C’est une grande bibliothèque et vos exigences en matière d’allocation de mémoire de base sont très différentes de celles des concepteurs de bibliothèques.

Même si vous pouvez faire en sorte que la version actuelle de Boost fonctionne selon vos besoins avec des allocateurs personnalisés, il est possible que cela se produise avec une nouvelle version de Boost.

N’hésitez pas à consulter le code source Boost pour des idées utiles, mais utilisez votre propre implémentation pour ce dont vous avez besoin.

J’examine actuellement la question. J’aimerais utiliser des mémoires tampons circulaires, des conteneurs sans locking et des E / S asynchrones. Au lieu d’allouer de la mémoire dynamic, je préférerais utiliser des pools de mémoire.

Le plus gros problème que j’ai vu jusqu’à présent est que shared_ptr est utilisé dans de nombreux endroits, sans qu’il soit facile de le remplacer par intrusive_ptr . Comme shared_ptr alloue de la mémoire dynamic pour suivre le nombre de références, je ne peux pas l’utiliser dans un système intégré.

Cela semble faisable, mais cela demande beaucoup de travail – je dois développer la spécification de modèle de toute classe contenant un shared_ptr afin que le type spécifique de pointeur partagé puisse être changé en intrusive_ptr si vous le souhaitez. Alors maintenant, je dois considérer le travail que cela va coûter, par rapport à ce que ça va être d’écrire ma propre version des fonctionnalités de Boost dont j’ai besoin. Pas un endroit agréable pour être.

J’espère que quelqu’un indique pourquoi je me trompe à ce sujet.