C ++: Quand devrais-je utiliser des structures au lieu de classes et où sont les différences de vitesse?

  • Quand devrais-je utiliser un struct au lieu d’une classe? J’utilise actuellement des classes pour tout, des wrappers de texture OpenGL aux fonts bitmap.

  • Une classe que j’utilise comme une struct (pas d’utilisation de l’inheritance, du polymorphism, etc.) est-elle toujours plus lente qu’une struct ?

Comme vous le savez peut-être, les structures et les classes en C ++ diffèrent uniquement par leur niveau d’access par défaut (et l’accessibilité par défaut de leurs bases: public pour struct, privé pour classe).

Certains développeurs, y compris moi-même, préfèrent utiliser des structures pour les types POD , c’est-à-dire avec des structures de style C, sans fonctions virtuelles, bases, etc. Les structures ne doivent pas avoir de comportement – elles ne sont qu’un groupe de données placées dans un seul object.

Mais c’est naturellement une question de style et, bien entendu, ni plus lent

1) Il n’y a pas de réelle différence entre les 2 autres que le fait que les membres de la structure sont, par défaut, publics alors que les classes sont privées.

2) Non, c’est exactement la même chose.

Edit: n’oubliez pas que vous pouvez utiliser l’inheritance virtuel avec des structures. Ils sont que identique 🙂

Au lieu de faire des économies et de faire référence à d’autres questions, je vais répéter ce que d’autres ont dit avant de les append.

struct et class sont identiques en C ++, la seule exception étant que struct a un access par défaut public et que class a un access par défaut privé. Les performances et la prise en charge des fonctionnalités linguistiques sont identiques.

Idiomatiquement, struct est principalement utilisé pour les classes “dumb” (plain-old-data). class est plus utilisée pour incarner une vraie classe.

De plus, j’ai également utilisé struct pour les objects fonction définis localement, tels que:

 struct something { something() : count(0) { } void operator()(int value) { std::cout << value << "-" << count++ << "\n"; } int count; } doSomething; std::vector values; ... std::foreach(values.begin(); values.end(); doSomething); 

comme d’autres l’ont expliqué, ils sont identiques, à l’exception des niveaux d’access par défaut.

la seule raison pour laquelle les classes peuvent être perçues comme étant plus lentes est qu’un bon style (mais pas le seul) est celui mentionné par ArmenTsirunyan : struct pour les types POD, class pour les classes d’objects à part entière. Ces dernières incluent généralement des méthodes d’inheritance et virtuelles, d’où des tables vtables, qui sont légèrement plus lentes à appeler que des fonctions droites.

J’aime utiliser des classes lorsque j’ai besoin d’un destructeur explicite. Dans ce cas, vous devriez suivre la règle de trois, auquel cas vous devez écrire un constructeur de copie et un surchargeur d’affectation. Avec tout cela, il semble plus naturel d’utiliser une classe qu’un struct.