Quels sont les frais généraux et autres considérations associés à lutilisation dune structure par rapport à une classe?

C sur les systèmes embarqués utilise traditionnellement des structures pour contenir des données structurées.

Arduino apporte le C ++ à la table, nous pouvons donc utiliser des classes à la place.

Disons que nous avons deux structures de données différentes qui pourraient être considérées comme très similaires:

typedef struct { int valueOne; int valueTwo; int valueThree; } value_t; 

et:

class Value { public: int valueOne; int valueTwo; int valueThree; } 

En termes de mémoire, quelle différence cela fera-t-il?

Je vois toujours que la technique de struct est fortement utilisée – pourquoi est-ce?

Commentaires

  • si je me souviens correctement de mon C ++ il ny a aucune différence entre struct et class en plus de la visibilité par défaut
  • Je suppose que struct sont principalement utilisés parce que la grande majorité du matériel embarqué est codée en C, donc quiconque passe beaucoup de temps à écrire du code pour de petits MCU connaît probablement beaucoup mieux le C que le C ++, et atteint automatiquement les idiomes C avant les idiomes C ++. Il ' est un problème de performances programmeur .

Réponse

Daprès la réponse acceptée de Quand devriez-vous utiliser une classe par rapport à une structure en C ++?

La seule différence entre une classe et une structure en C ++ est que les structures ont des membres publics par défaut et les bases et les classes ont des membres et des bases privés par défaut. Les classes et les structures peuvent avoir un mélange de membres publics et privés, peuvent utiliser lhéritage et peuvent avoir des fonctions membres.

Je recommanderais dutiliser des structures comme des structures de données anciennes sans aucune fonctionnalité de classe, et en utilisant des classes comme structures de données agrégées avec des données privées et des fonctions membres.

En ce qui concerne la mémoire, le modificateur daccès ne fait aucune différence et étant donné les contraintes de mémoire de lArduino, les gens sont moins susceptibles dutiliser des classes avec des hiérarchies complexes, mais préfèrent quand même les structures POD.

Réponse

Contrairement à C, une instance dun struct en C ++ est un objet exactement de la même manière quune instance dun class. Du point de vue du code compilé, ils sont identiques. Lutilisation de la mémoire, lalignement, les temps daccès, etc. sont exactement les mêmes (cest-à-dire quil ny a pas de frais généraux).

Du point de vue du programmeur, il y a une très petite différence. Les membres dun struct ont une visibilité publique par défaut, tandis que les membres dun class ont une visibilité privée par défaut. Sinon, toutes les fonctionnalités linguistiques fonctionnent de la même manière sur les deux, tels que les constructeurs / destructeurs, lhéritage, le polymorphisme, les modèles et la surcharge dopérateurs. Vous pouvez même dériver un struct à partir dun class, et vice versa.

Malgré la similitude, il est assez courant de voir des gens utiliser délibérément un struct en C ++ pour des structures très simples, par exemple où il ne se compose que de quelques membres de données, mais pas de fonctions. Un class serait utilisé pour tout ce qui est plus complexe. Ceci est purement une question de convention ou de préférence personnelle cependant, et peut être utilisé comme une indication subtile de la complexité prévue de la structure.

Réponse

Comme dautres réponses lont souligné, vos performances struct et class ne se distinguent pas (il existe de légères différences dans les les portées des noms de type, en raison de la façon dont vous avez défini votre structure). La délimitation en C ++ nest pas entre struct et class, mais entre les types qui sont POD (données anciennes simples) et les types qui ne le sont pas, comme expliqué dans cette discussion .

Réponse

En termes de mémoire, quelle différence cela fera-t-il?

Aucun. Les structures et les classes sont la même chose, ne différant que par les niveaux de protection, et linstanciation crée un « objet ».

voit toujours la technique de struct étant fortement utilisée – pourquoi est-ce?

Moins de frappe si vous  » nessayez pas de masquer les membres de données.

Réponse

Notez que

typedef struct { ... } Foo; 

est obsolète en C ++ et vous devriez simplement utiliser

struct Foo { ... }; 

Ce nest pas très clair dans les réponses mais lautre effet des structures est héritage public par défaut vs héritage privé par défaut avec les classes.

Comme mentionné par dautres, lutilisation de struct est généralement une convention pour les types POD.

De plus, techniquement, « struct vs object » devrait être « struct vs class » (comme instancier un struct ou une classe donne toujours un objet).

Commentaires

  • Objet de question modifié – > classe.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *