2015-12-11 1 views
5

En essayant d'apprendre lvalues, rvalues et l'allocation de mémoire pour eux. Donc, avec beaucoup de matériel d'apprentissage, il y a un peu de chaos.Comment les valeurs de C++ sont-elles stockées en mémoire?

Une valeur rvalue est une valeur qui doit exister uniquement dans les limites d'une expression où elle a été créée (jusqu'au moins C++ 11). Il a donc une adresse et un bloc de mémoire qu'il occupe. Mais par définition, nous ne pouvons pas obtenir une adresse de rvalue, parce que c'est un objet temporaire contrairement à lvalue. Mais même avant C++ 11 nous pouvions obtenir une adresse de rvalue en la renvoyant d'une fonction et en l'enregistrant dans un type de référence const (euh, je suppose pas une adresse mais une valeur).

Donc, plus précisément, comment fonctionne l'allocation rvalue? Pendant combien de temps le programme ou le système d'exploitation se souvient-il vraiment de cet endroit de mémoire où le rvalue a été créé et marqué comme affecté et un autre objet ne peut pas prendre sa place? Comment je le vois, maintenant rvalues sont stockés comme lvalues mais nous avons simplement d'autres droits d'accès. Et ils ont d'autres types de désallocation - pour lvalues hors de portée, pour rvalues peut être optimisé par existence dans les limites de l'expression ou jusqu'à ce qu'il n'y ait plus de liens vers elle.

+4

Ils n'utilisent aucun stockage. Qu'est-ce que l'utilisation du stockage est * objets *. (et parfois, des références). Vous semblez écrire "rvalue" alors qu'en fait vous voulez dire "objet temporaire". –

+0

Je ne pense pas que les valeurs doivent avoir une adresse du tout. Ils peuvent simplement être évalués dans des registres. –

+0

@ M.M, vous avez raison. –

Répondre

5

Réponse courte: dépend de l'implémentation.

Le raisonnement principal derrière ceci est comme toujours la liberté pour le compilateur d'améliorer les performances de votre code. Une façon plus concrète de comprendre ceci est de se rappeler qu'une valeur peut être stockée dans un registre de votre CPU et ne jamais être réellement dans votre mémoire ce qui signifie plus ou moins que la valeur n'a pas d'adresse. Je ne parierai pas tout ce que j'ai sur le sujet mais c'est probablement l'une des principales raisons pour lesquelles "nous ne pouvons pas obtenir une adresse de valeur". D'une manière plus générale, puisqu'une valeur est sémantiquement temporaire, elle est plus susceptible d'être placée dans des endroits temporaires ou optimisée de telle sorte qu'elle ne peut pas être facilement associée à une adresse, et même si cela peut être contre-productif dans termes de performance.

4

D'un point de vue conceptuel, les valeurs se trouvent sur la "pile". Si vous arrivez à leur adresse, c'est théoriquement une adresse quelque part sur la pile. Si l'adresse n'est pas prise du tout, l'entité peut ne jamais vraiment exister tant que le compilateur met en place les instructions correctes pour qu'il apparaisse comme si il a été créé.

Même si l'entité est réellement créée là où elle réside exactement dépend de diverses choses et peut même ne pas être du tout sur la pile: elle peut être dans la pile courante mais peut aussi être une autre pile ou dans une certaine destintation si le rvalue finit par être copié/déplacé là et que le compilateur fait une copie-élision. Si le rvalue finit par être lié à un const&, il peut également résider ailleurs que s'il ne le faisait pas.

La durée de vie de la valeur est liée par les règles de langage. Comment cela est réellement mis en œuvre est à peu près à la hauteur du compilateur et/ou de l'ABI auquel il adhère. Les lvalues ​​et les valeurs sont des catégories d'expression.