Pour un très à ressources limitées cible, telle qu'4 ko de RAM, j'avais tester les eaux avec quelques échantillons avant de commettre beaucoup d'efforts qui ne peuvent pas être facilement porté en arrière dans un pur C ANSI mise en œuvre.
L'Embedded C++ groupe de travail a proposé une norme sous-ensemble de la langue standard et un sous-ensemble de la bibliothèque standard pour aller avec elle. J'ai perdu la trace de l'effort lors de la C de l'Utilisateur du Journal est mort, malheureusement. Il semble qu'il y est un article de Wikipédia, et que le comité existe toujours.
Dans un environnement embarqué, vous devez vraiment être prudent quant à l'allocation de la mémoire. Pour faire valoir ce que de soins, vous devrez peut-être définir le global operator new()
et ses amis pour quelque chose qui ne peut pas même être liées, de sorte que vous savez qu'il n'est pas utilisé. Placement new
sur l'autre main est susceptible d'être votre ami, lorsqu'il est utilisé judicieusement avec une stable, thread-safe, et la latence de la garantie schéma d'allocation.
Inline fonctions ne cause pas trop de problème, sauf si elles sont suffisamment grosses pour qu'elles devraient avoir été de véritables fonctions en premier lieu. Bien sûr, les macros à leur remplacement avait le même problème.
Modèles, trop, ne peut pas poser de problème, sauf si leur instanciation s'exécute amok. Pour n'importe quel modèle que vous utilisez, à la vérification de votre code généré (le lien de la carte peut avoir suffisamment d'indices) pour s'assurer que seuls les instanciations que vous souhaitez utiliser est arrivé.
Un autre problème qui peut se poser est celle de la compatibilité avec votre débogueur. Il n'est pas inhabituel pour un matériel utilisable débogueur ont très peu de soutien pour l'interaction avec le code source d'origine. Si vous devez déboguer dans l'assemblée, puis le nom intéressant déformation de C++ peut qu'ajouter de la confusion à la tâche.
RTTI, dynamique jette, l'héritage multiple, lourd polymorphisme, et d'exceptions près, venir avec une certaine quantité d'exécution coût de leur utilisation. Quelques-unes de ces caractéristiques niveau que les coûts sur l'ensemble du programme, s'ils sont utilisés, d'autres se contentent d'augmenter le poids des classes qui en ont besoin. Connaître la différence, et de choisir les fonctionnalités avancées à bon escient avec pleine connaissance d'au moins un rapide coup d'une analyse coût/bénéfice.
Dans un petit environnement embarqué vous serez soit en les reliant directement à un noyau temps réel ou en exécutant directement sur le matériel. De toute façon, vous aurez besoin pour faire certain que votre runtime code de démarrage des poignées de C++ spécifiques de démarrage tâches correctement. Cela pourrait être aussi simple que de s'assurer d'utiliser les options du linker, mais depuis qu'il est commun d'avoir un contrôle direct sur la source de la puissance sur réinitialiser le point d'entrée, vous pourriez avoir besoin de vérification, assurez-vous qu'il s'occupe de tout. Par exemple, sur un ColdFire plate-forme, j'ai travaillé sur, les outils de dev livré avec un CRT0.S module qui a eu le C++ initialiseurs présent, mais en commentaire. Si j'avais utilisé directement à partir de la boîte, j'aurais été mystifié par des objets globaux dont les constructeurs n'avait jamais fonctionner à tous.
Aussi, dans un environnement embarqué, il est souvent nécessaire d'initialiser les périphériques matériels avant qu'ils puissent être utilisés, et si il n'y a pas d'OS et pas de chargeur de démarrage, alors il est de votre code qui le fait. Vous aurez besoin de se rappeler que les constructeurs pour les objets globaux sont exécutés avant main()
est appelé ainsi, vous aurez besoin de modifier votre local CRT0.S (ou son équivalent) pour obtenir que l'initialisation du matériel de fait avant le mondial des constructeurs eux-mêmes sont appelés. Évidemment, le haut de l' main()
est trop tard.