Question

Nous utilisons c ++ pour développer une application qui s'exécute sous 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 est possible pour nous d'utiliser les bibliothèques boost au lieu de nos propres conteneurs dans ces conditions?

Tous les commentaires et / ou conseils sont les bienvenus!

Merci beaucoup,

Nic

Était-ce utile?

La solution

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 des éléments dans le conteneur une seule fois au démarrage de l'application, sans ajouter / supprimer d'éléments en permanence.)

Autres conseils

Nous utilisons boost pour les systèmes embarqués . Avec Boost, vous pouvez choisir et 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 parties de boost soient applicables. Certaines parties de boost ne sont pas affectées et pourraient vous être utiles.

Je choisirais et choisirais en fonction de vos besoins.

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

Le remplacement de vos conteneurs par des conteneurs Boost n’est PAS une bonne idée. La tâche consistant à créer des allocateurs personnalisés appropriés ne serait pas si difficile, mais vous violeriez l'esprit de votre règle d’allocation au démarrage. D'après mon expérience, cette règle a pour principe de ne pas avoir à gérer de 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 la finalité de la règle "attribuer 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 n’incluant pas encore TR1.

N'utilisez pas Boost.

Il s’agit d’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 qu'une version actuelle de Boost fonctionne selon vos besoins avec des allocateurs personnalisés, il se peut 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.

Je suis en train de regarder ça maintenant & # 8212; J'aimerais utiliser des tampons circulaires, des conteneurs sans verrouillage et des E / S asynchrones. Au lieu d'allouer de la mémoire dynamique, je préférerais utiliser des pools de mémoire.

Le plus gros problème que j'ai observé jusqu'à présent est que shared_ptr est utilisé dans de nombreux endroits, sans moyen facile de le remplacer par intrusive_ptr . Étant donné que shared_ptr alloue de la mémoire dynamique pour garder trace du nombre de références, je ne peux pas l'utiliser dans un système intégré.

Cela semble faisable, mais beaucoup de travail & # 8212; 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. Ce n'est pas un endroit agréable.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top