7
votes

Pourquoi ne pas avoir une adresse?

Pourquoi ne pas avoir une adresse mémoire? Ne sont-ils pas chargés dans la RAM lorsque le programme exécute ou se réfère-t-il aux valeurs stockées dans des registres de processeur?


0 commentaires

5 Réponses :


-1
votes

Que voulez-vous dire, les r devalouds ont une adresse. Jamais essayé xxx


4 commentaires

Vous pouvez capturer une référence de const à une rvalue, puis obtenir le pointeur du const, comme dans mon exemple de code.


@ K-ballo: Non. La référence du contre est liée à l'objet temporaire .


La catégorie de valeur est une propriété d'expression. Dans votre exemple, nous supposons que rvalue est en effet une rvalue mais la valeur est vraiment un lvalue. La façon dont une variable ( valeur dans ce cas) a été initialisée n'affecte pas sa catégorie de valeur lorsqu'elle est utilisée dans une expression plus tard. Le fait que la variable la valeur a été initialisée par une rvalue ne signifie rien pour la catégorie de valeur de la valeur lorsqu'il est utilisé dans l'expression et la valeur . C'est toujours un lvalue.


@Nawaz ou un XValue.



1
votes

penser à rvalue comme valeur d'une expression . La valeur elle-même n'a pas d'adresse. Mais les objets impliquent dans l'expression ont une adresse. Vous pouvez prendre l'adresse d'un objet , même s'il s'agit d'un objet temporaire.

considère cela, xxx

ici, 10 < / Code> est une rvalue, de sorte qu'il apparaît que & i est une adresse du 10 . Non, c'est faux. & i est une adresse de l'objet temporaire de type int , qui est créé hors de l'expression 10 . Et puisque l'objet temporaire ne peut pas être lié à une référence non-Const, j'utilise const . Cela signifie que ce qui suit est une erreur: xxx


0 commentaires

10
votes

Votre question ("Pourquoi ne pas avoir une adresse mémoire?") Est un peu confus. Une rvalue est une sorte d'expression. expressions ne pas avoir d'adresses: objets ont des adresses. Il serait plus correct de demander "pourquoi ne peut-on pas appliquer l'adresse de l'opérateur à une expression de rvalue?"

La réponse à celle-ci est plutôt simple: vous ne pouvez prendre que l'adresse d'un objet et toutes les expressions de rvalue se réfèrent à des objets (par exemple, l'expression 42 a une valeur mais ne fait pas référence à un objet).

Certaines expressions de rvalue font référence à des objets, mais de tels objets manquent de persistance. Un objet mentionné par une expression de rvalue est un objet temporaire et est détruit à la fin de l'expression dans laquelle elle est créée. Ces objets ont en effet des adresses (vous pouvez facilement découvrir cela en appelant une fonction de membre sur un objet temporaire; le pointeur Ce pointeur doit pointer sur l'objet temporaire et donc l'objet temporaire doit avoir une adresse). < / p>

C'est la différence fondamentale entre les expressions de Lvalue et les expressions de rvalue. Les expressions Lvalue font référence à des objets qui ont une persistance: l'objet à laquelle une expression de lvalue fait référence à persiste au-delà d'une expression unique .


0 commentaires

-2
votes

Prenez simplement ce cas

int* a = &3;
  • est 3 un objet? li>
  • Où 3 seront-ils situés en mémoire? li> ul>

    Lorsque vous avez besoin de l'adresse d'un objet, vous utilisez et. P>

    Si des r devalues ​​seraient adressables, cela signifie que vous pouvez déclarer un pointeur sur l'endroit où votre ordinateur a décidé de stocker 3 P>

    int a = 1 + 2;
    


0 commentaires

1
votes

La question implique deux aspects différents liés à la "spécification" et à la "mise en œuvre".

La "spécification" définit certaines règles abstraites qui définissent la manière dont la langue se comporte de respect à une machine abstraite qu'elle fonctionne. Adaptez cette "machine abstraite" à la "vraie" sous celle-ci, c'est un but du compilateur (pas la langue).

Qu'est-ce que la spécification est la mise en application, c'est-ce que le point de support de langue - un "stockage" (un morceau de mémoire avec une adresse appropriée) n'est donné qu'aux objets qui ont un nom (pour le L'existence de la portée qui nomme vit) ou qui sont allouées de manière dynamique avec une demande explicite ( nouveau ). Tout le reste est "temporaire": attribuer, copier et se déplace comme un objet, mais n'est pas nécessaire pour exister dans un endroit bien défini et stable. Au moins, pas dans le but de la langue.

Bien sûr, cela doit rester (physiquement) quelque part, vous pouvez donc que vous puissiez-qu'on peut-être moulé ou conversion approprié, essayant de deviner une adresse mémoire. Mais la spécification linguistique n'accorde aucun comportement cohérent si vous essayez de l'utiliser activement. Cela signifie que différents compilateurs peuvent se comporter différemment et optimiser mieux ils peuvent respecter la vraie machine qu'ils ciblent.


0 commentaires