Question

MSDN dit qu'une classe qui serait 16 octets ou moins serait mieux traitée comme une struct [citation] .
Pourquoi est-ce?
Est-ce que cela signifie que si un struct est de plus de 16 octets, il est moins efficace qu'une classe ou est-ce le même?
Comment déterminez-vous si votre classe est de moins de 16 octets?
Ce qui limite un struct d'agir comme une classe? (En plus de constructeurs de rejetant sans paramètre)

Était-ce utile?

La solution

Il y a quelques réponses différentes à cette question, et il est un peu subjectif, mais quelques raisons que je peux penser sont:

  • Structs sont de type valeur, les classes sont de type de référence. Si vous utilisez 16 octets pour le stockage totale, il est probablement pas la peine de créer des références de mémoire (4 à 8 octets) pour chacun.
  • Lorsque vous avez des objets vraiment petits, ils peuvent souvent être poussé sur la pile de IL, au lieu de références aux objets. Cela peut vraiment accélérer un peu de code, comme vous éliminer un déréférencement de mémoire sur le côté callee.
  • Il y a un peu de « duvet » supplémentaire associé aux classes en IL, et si votre structure de données est très faible, aucune de ces peluches serait utilisé de toute façon, il est juste ordure supplémentaire que vous n'avez pas besoin.

La différence la plus importante entre une struct et une classe, cependant, est que struct sont le type de valeur et les classes sont de type de référence.

Autres conseils

Par « efficace », ils sont probablement parler de la quantité de mémoire nécessaire pour représenter la classe ou struct.

Sur la plate-forme 32 bits, l'allocation d'un objet nécessite un minimum de 16 octets. Sur une plate-forme 64 bits, la taille minimale de l'objet est de 24 octets. Donc, si vous cherchez à elle uniquement de la quantité de mémoire utilisée, une struct qui contient moins de 16 octets de données sera « meilleure » que la classe correspondante.

Mais la quantité de mémoire utilisée est pas toute l'histoire. types de valeur (structs) sont fondamentalement différents de types de référence (classes). Struct peut être gênant de travailler avec, et peut effectivement causer des problèmes de performances si vous ne faites pas attention.

La vraie réponse, bien sûr, est d'utiliser selon qui fonctionne le mieux dans votre situation. Dans la plupart des cas, vous serez beaucoup mieux en utilisant des classes.

Vérifiez ce lien, je l'ai trouvé sur l'une des réponses en SO aujourd'hui: . NET type de Internes. Vous pouvez également essayer la recherche SO et recherche sur Google pour « types de référence contre les types de valeurs » pour les différences entre les classes et structs.

  
    

Qu'est-ce que limite un struct d'agir comme une classe?

  

Il y a beaucoup de différences. Vous ne pouvez pas hériter d'un struct, par exemple.

Vous ne pouvez pas avoir des méthodes virtuelles, de sorte que vous ne pouvez pas utiliser une struct pour implémenter une interface. Les méthodes d'instance dans struct peuvent accéder aux champs privés de struct, mais à part cela ils se comportent un peu comme des fonctions « aide » auxilirary (pour les structures immuables, parfois ils ne même pas besoin d'accéder à des données privées). Donc, je les trouve pas aussi près que « valeur » que les méthodes de classe.

Ceci est dû à la différence que les poignées de façon CLR structs et les classes. Struct sont les types de valeurs qui signifie qu'ils vivent sur la pile plutôt que dans le tas managé. Il est une bonne règle de base pour garder struct petit car une fois que vous commencez à les passer comme arguments de la méthode que vous encourrez les frais généraux comme struct sont copiés dans leur intégralité lorsqu'il est passé à une méthode.

Les classes passent une copie de leur référence aux méthodes qu'ils encourent beaucoup moins de frais généraux lorsqu'ils sont utilisés comme arguments de la méthode.

La meilleure façon de déterminer la taille de votre classe est au total le nombre d'octets requis par tous les membres de votre classe plus 8 octets supplémentaires pour des trucs frais généraux CLR (l'index de bloc de synchronisation et la référence au type de objet).

Structs sont différentes des classes car ils sont stockés sur la pile, et non sur le tas. Cela signifie que chaque fois que vous appelez une méthode avec le paramètre struct, une copie est créée et transmise à la méthode. Voilà pourquoi les grandes struct sont extrêmement inefficaces.

Je déconseille d'utiliser activement struct néanmoins, car il pourrait causer quelques bugs subtils: par exemple lorsque vous modifiez un champ d'une struct, sa ne va pas se traduire par l'appelant (parce que vous ne avez modifié la copie) -. qui est un comportement complètement différent aux classes

Ainsi, les 16 octets, je pense est une taille maximale raisonnable d'un struct, mais dans la plupart des cas, il est préférable d'avoir une classe. Si vous voulez toujours créer un struct, essayer de le rendre immuable au moins.

Dans la mémoire, la struct contiendra les données directement, tandis qu'une classe se comporte plus comme un pointeur. Ce seul fait une différence importante, étant donné que le passage struct comme paramètre à une méthode passera ses valeurs (les copier sur la pile), alors que la classe passera la référence aux valeurs. Si le struct est grand, vous allez copier beaucoup de valeurs sur chaque appel de méthode. Quand il est vraiment petite copie les valeurs et les utiliser sera directement probablement plus rapide que la copie du pointeur et d'avoir à les saisir d'un autre endroit.

A propos des restrictions. Vous ne pouvez pas l'attribuer à null (bien que vous pouvez utiliser Nullable <>) et vous devez l'initialiser immédiatement

Copie d'une instance d'une struct prend moins de temps que la création d'une nouvelle instance de données de classe et de copie d'un ancien, mais les instances de classe peuvent être partagées et les instances struct peuvent pas. Ainsi, "structvar1 = structvar2" nécessite la copie nouvelle instance struct, alors que "classvar1 = classvar2" permet classvar1 et classvar2 se référer à la même instance struct (sans avoir à créer un nouveau).

Le code pour gérer la création de nouvelles instances struct est optimisé pour les tailles jusqu'à 16 octets. Struct plus grandes sont traitées moins efficacement. Struct sont une victoire dans les cas où chaque variable qui est titulaire d'une struct tiendra une instance indépendante (à savoir il n'y a aucune raison de penser que les deux variables particulières détiendront des cas identiques); ils ne sont pas beaucoup plus d'une victoire (si elles sont une victoire du tout) dans les cas où de nombreuses variables peuvent tenir la même instance.

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