Besoin d'interprétation de la section dans la spécification C #

11

Je lis la spécification C # . Je pourrais utiliser des clarifications sur un segment:

C # a un système de type unifié. Tous les types C #, y compris les types primitifs tels que int et double, héritent d'un seul type d'objet racine. Ainsi, tous les types partagent un ensemble d'opérations communes et les valeurs de tout type peuvent être stockées, transportées et exploitées de manière cohérente. En outre, C # prend en charge à la fois les types de référence définis par l'utilisateur et les types de valeur, permettant l'allocation dynamique des objets ainsi que le stockage en ligne des structures légères.

Que signifie «stockage en ligne de structures légères» dans ce contexte?

ChuckT
la source

Réponses:

11

La réponse de Svick est bonne, mais j'ai pensé ajouter quelques points supplémentaires.

Tout d'abord, le paragraphe est défectueux. Les types de pointeur n'héritent pas de l'objet. Les valeurs qui sont au moment de la compilation connues pour être des types d'interface ou des types de paramètres de type seront, lors de l'exécution, soit des références non valides, soit des instances authentiques de quelque chose qui hérite de l'objet, mais il m'a toujours été étrange de dire que ces types " hériter "de l'objet; l'héritage est la propriété que les membres de l'ancêtre sont membres du descendant, mais vous ne pensez normalement pas à "ToString" comme étant un membre de IEnumerable. Vous pensez que c'est un membre de la chose qui implémente IEnumerable .

Le paragraphe est également défectueux car c'est le seul endroit où "type primitif" apparaît dans la spécification, et il apparaît sans définition. Il est donc à la fois inutile et déroutant et doit être supprimé.

Je veux que ce paragraphe soit corrigé depuis un moment. La prochaine fois que je verrai Mads, je lui rappellerai.

Pour répondre à votre question spécifique: svick est bien sûr correct, mais il est utile de voir un exemple spécifique. Quand tu dis:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

et vous créez, disons, un tableau:

ColorfulInt[] x = new ColorFulInt[100];

Ensuite, le stockage de ces 100 pouces et 100 couleurs va dans le tableau lui-même . Si ColorfulInt était plutôt une classe, le tableau contiendrait 100 références à ColorfulInt, chacune devant être allouée individuellement. L'allocation individuelle de ces cent éléments est beaucoup moins efficace à la fois dans le temps et dans l'espace que la simple allocation du stockage directement dans le tableau lui-même.

Eric Lippert
la source
Alors, est-ce important dans l'abstraction de la mémoire de ces objets, où lorsque vous êtes prêt à les manipuler, ils sont plus faciles d'accès s'ils sont dans un bloc contigu de versets spatiaux adressables pointeurs vers qui sait où? Est-ce exact ou est-ce que je manque encore quelque chose?
ChuckT
@ChuckT: correct. Vous ne payez pas les frais généraux de l'indirection, et vous obtenez également une belle localité de cache.
Eric Lippert
12

Cela signifie que les types de valeur sont stockés directement là où vous les définissez, ce qui les rend plus efficaces par rapport aux types de référence.

Que veut dire ceci exactement? Si vous avez une variable locale d'un type valeur, elle sera généralement stockée directement sur la pile (mais il existe de nombreuses exceptions). Si vous avez un champ d'un type valeur, il sera stocké directement dans la classe ou la structure englobante.

svick
la source
1
Ça a du sens. Merci d'avoir étoffé cela pour moi, svick!
ChuckT