Quels frais généraux et autres considérations y a-t-il lors de l'utilisation d'un struct vs d'une classe?

17

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

Arduino apporte 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 largement utilisée - pourquoi est-ce?

Cybergibbons
la source
5
si je me souviens bien de mon C ++ il n'y a pas de différence entre structet en classplus de la visibilité par défaut
ratchet freak
4
Je suppose que les structs sont utilisés principalement parce que la grande majorité du matériel embarqué est codé en C, donc toute personne qui passe beaucoup de temps à écrire du code pour les petits MCU connaît probablement mieux C que C ++, et atteint automatiquement les idiomes C avant les idiomes C ++. C'est un problème de performances du programmeur .
Connor Wolf

Réponses:

13

Comme tiré de la réponse acceptée de Quand devriez-vous utiliser une classe vs une structure en C ++?

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

Je recommanderais d'utiliser des structures en tant que structures de données anciennes sans aucune fonctionnalité de classe, et d'utiliser des classes en tant que 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 d'accès ne fait aucune différence et étant donné les contraintes de mémoire de l'Arduino, les gens sont moins susceptibles d'utiliser des classes avec des hiérarchies complexes, mais préfèrent quand même les structures POD.

monstre à cliquet
la source
6

Contrairement à C, une instance de a structen C ++ est un objet exactement de la même manière qu'une instance de a class. Du point de vue du code compilé, ils sont identiques. L'utilisation de la mémoire, l'alignement, les temps d'accès, etc. sont exactement les mêmes (c'est-à-dire qu'il n'y a pas de surcharge).

Du point de vue du programmeur, il y a une différence très mineure. Les membres d'un structont une visibilité publique par défaut, tandis que les membres d'un classont une visibilité privée par défaut. Sinon, toutes les fonctionnalités du langage fonctionnent de la même manière sur les deux, telles que les constructeurs / destructeurs, l'héritage, le polymorphisme, les modèles et la surcharge des opérateurs. Vous pouvez même dériver un structde a class, et vice versa.

Malgré la similitude, il est assez fréquent de voir des gens utiliser délibérément un structen C ++ pour des structures très simples, par exemple lorsqu'il ne se compose que de quelques membres de données, mais pas de fonctions. Un classserait utilisé pour quelque chose de plus complexe. Ceci est purement une question de convention ou de préférence personnelle, et peut être utilisé comme une indication subtile de la complexité prévue de la structure.

Peter Bloomfield
la source
4

Comme d'autres réponses l'ont souligné, vos performances sont particulières structet classindiscernables (il existe de légères différences dans les étendues des noms de type, en raison de la façon dont vous avez défini votre structure). La délimitation en C ++ n'est pas entre structet 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 .

microtherion
la source
3

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èrent que par les niveaux de protection et l'instanciation crée un «objet».

voyez toujours la technique de struct utilisée de manière intensive - pourquoi est-ce?

Moins de saisie si vous n'essayez pas de masquer les membres de données.

Boue
la source
2

Notez que

typedef struct { ... } Foo;

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

struct Foo { ... };

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

Comme mentionné par d'autres, l'utilisation de struct est généralement une convention pour les types POD.

Techniquement, «struct vs object» devrait également être «struct vs class» (car l'instanciation d'un struct ou d'une classe donne toujours un objet).

codah
la source
Objet de question édité-> classe.
Cybergibbons