0
votes

C ++ `this` pointeur

1) Comment Ce pointeur est différent des autres pointeurs? Comme je comprends que je comprenne, les pointeurs indiquent la mémoire dans le tas. Est-ce que cela signifie que les objets sont toujours construits dans le tas, étant donné qu'il y a un pointeur pour eux?

2) pouvons-nous voler ce pointeur dans le constructeur de déplacement ou déplacer l'affectation?


5 commentaires

"Comme je comprends que les pointeurs indiquent la mémoire dans le tas." Ce n'est pas limité au tas.


La première question est répondue mais en ce qui concerne 2, le but est que vous changez d'adresse. Vous ne pouvez pas utiliser ce pointeur pour votre autre objet. Sauf si vous voulez dire simplement en utilisant cela, auquel cas il y a une meilleure pratique pour le faire pour éviter de vous déplacer au même endroit: docs.microsoft.com/en-us/cpp/cpp/...


@kjhf ... quoi?


Votre compréhension des pointeurs est fausse. Un pointeur peut indiquer n'importe où dans l'espace d'adressage de la mémoire.


@Swordfish je pense à quel point op signifie utiliser le mot-clé pour faire référence à l'objet d'objet déplacé, alors volez. Je souligne également que l'utilisation de ce est une meilleure pratique dans le déplacement des constructeurs / affectations par le lien pour vérifier la même source et la même destination.


3 Réponses :


7
votes

Comment ce pointeur est différent des autres pointeurs?

Ce n'est pas différent des autres pointeurs, sauf que vous ne pouvez pas modifier sa valeur et qu'il n'existe que dans les fonctions des membres. C'est un mot clé réservé.

Si je comprends bien les pointeurs, pointez la mémoire dans le tas. Est-ce que cela signifie que les objets sont toujours construits dans le tas, étant donné qu'il y a un pointeur pour eux?

Non, les pointeurs (valides ou invalides) peuvent pointer "n'importe où". Non, les structures / classes peuvent être attribuées n'importe où. Sur le magasin automatique (pile), sur le magasin libre (tas), ailleurs si la plate-forme le supporte.

Peut-on voler ce pointeur dans le constructeur de déplacement ou déplacer l'affectation?

Pas exactement sûr de ce que vous demandez, mais la réponse est le plus probablement non.


23 commentaires

" Non, les pointeurs peuvent pointer n'importe où. " - Nitpick. Ils peuvent, bien que vous ne puissiez pas faire beaucoup avec eux quand ils sont invalides.


"Mais la réponse est très probablement non." :RÉ


@AYXAN SOWWY -.-


Je ne pense pas que vous puissiez faire pointer n'importe où. Vous pouvez signaler nullptr et sur des objets existants et un autre après les objets existants. La pointe de l'UB est probablement utile pour prendre en charge des plates-formes qui piégent sur des pointeurs non valides lors de leur formation.


@Swordfish Ooooh, ces virgules étaient importants =] mais maintenant, encore une fois, Nitpick " Non, les structures / classes peuvent être allouées n'importe où. " n'est pas vrai dans le sens, qu'un objet peut avoir une adresse. Certaines valeurs ne seront jamais des pointeurs valides. Bien que vous ne vouliez probablement pas dire cela comme ça. La norme BTW C ++ n'a pas de notion de tas et de pile. Il existe un concept appelé stockage, il peut être dynamique ou statique (ou automatique), bien que la mise en œuvre n'est pas spécifiée.


@NWP NOPE, DERRÉFERENCE (indirectement) est UB, détenir une valeur est bonne. Un pointeur peut avoir une valeur de pointeur non valide et c'est bien, l'utiliser n'est pas.


@ Luk32 BTW C ++ Standard n'a pas de notion de tas ni de pile. - C'est pourquoi je mets ces termes en bretelles.


Vous ne pouvez pas pointer "nulle part" et les pointeurs non valides ne font pas pointer n'importe où. Mais votre réponse est filet géniale


@LighessRacksinorbit Référence standard?


@Swordfish Trop beaucoup pour citer dans un commentaire. Pouvez-vous citer la notion que les pointeurs peuvent pointer «n'importe où»?


@LighessRacksinorbit Nous parlons d'une valeur de pointeur non valide dans ce cas. Comment pouvez-vous dire que cela ne pointe pas quelque part?


@Swordfish parce que ce n'est pas? Les pointeurs ne sont pas des chiffres. Ce sont des pointeurs. eel.is/c++Draft/basic.types#basic. Composé-3 eel.is/c++draft/basic.sc # 4 Une carte au trésor ne vous mène pas de chérir si le Trésor est parti, même s'il peut encore avoir des mots et des flèches et des images dessus.


@LightnessRacsinorbit Que diriez-vous de la formulation: un pointeur peut pointer sur un objet n'importe où dans la mémoire. Cela serait-il correct?


@Lightnessrsinorbit Il va descendre à la sémantique et que signifie "point de pointe". Je pense eel.is/c++Draft/basic.compound#33/a > le couvre. Si vous dites que le pointeur ne peut pointer uniquement à l'objet, alors oui, le pointeur ne peut pas pointer n'importe où, mais uniquement aux objets, mais il peut avoir chaque valeur que son type permet de la valoriser et ce sera une valeur de pointeur non valide, je suppose que nous pouvons sauter en discutant Que ce soit pointe vers les ordures, ou cela ne pointe nulle part, tout est clair ce que tout le monde signifie, je pense. Avec la carte analogie, vous pourriez argumenter, cette carte vous indique toujours à un endroit, qu'est-ce qui est à l'endroit est une autre chose.


@LightnessRacesInorbit Une carte au trésor ne vous mène pas de chérir si le Trésor est parti, même s'il peut encore avoir des mots et des flèches et des images dessus. - Je l'appellerais toujours une carte au trésor. Je connais un canard quand j'en vois un.


@ Luk32 Quand ma plate-forme me permet de lire Dwords à partir de 0x08000000 et je définit un std :: uint32_t * foo = 0x08000000; ... Est-ce que cela indique un objet dans le sens C ++? Je doute que.


@erorika Yep beaucoup mieux


@Swordfish Certainement pas. Cela ne pointe pas d'un objet. Il ne pointe même pas un int (sauf si ce int est venu de la vie auparavant). Mais cela indique-t-il un emplacement en mémoire? Quoi qu'il en soit, tout le monde se comprend ici, alors je suppose que c'est bien ... Je veux dire que c'est une discussion sur la signification des mots anglais, et non C ++. Alors ... oui.


@Swordfish oui mais ça ne pointe pas de trésor. Même chose, un pointeur non valide est toujours un pointeur, mais cela ne pointe nulle part.


@ Luk32 Il est compréhensible jusqu'à ce que vous vous souveniez que le code source ne soit pas une mappage unique aux instructions que l'ordinateur suivra. Attendez-vous à ce que votre compilateur / optimiseur fasse des choses folles lorsque vous vous déconnectez avec des pointeurs non valides (indépendamment de vos déréférences)! Juste code pour spécification et tout ira bien


Ok, arrêtons ça;)


@LightnessRacesinorbit 'am juste dire que vous pouvez placer des valeurs de pointeur non valides dans une variable de pointeur et que les pointeurs contiennent parfois de telles valeurs. Rien d'autre, c'est à la spécification. J'ai vu le code de production Changement de comportement basé sur les paramètres d'optimisation à cause de si (this == nullptr) renvoie 0; ... Donc, je suis d'accord, attendez-vous à ce que des trucs amusants arrivent à l'optimisation du pointeur, même si vous peut soutenir que vous êtes toujours sur le côté légal.


@ luk32 Pouvez-vous donner un exemple de faire ça?



7
votes

Comment ce pointeur est différent des autres pointeurs?

the Ce pointeur existe uniquement dans le contexte d'une fonction de membre de la classe STATIC . Il est également implicite, son nom est un mot clé réservé et il est toujours un Expression prvalue . Sinon, c'est la même chose que tout autre pointeur.

Si je comprends bien les pointeurs, pointez la mémoire dans le tas.

Les pointeurs peuvent indiquer quoi que ce soit en mémoire. Il n'est pas limité au tas et non plus Objets .

Peut-on voler ce pointeur dans le constructeur de déplacement ou déplacer l'affectation?

Ceci est toujours une expression prvalue. Il n'est pas possible d'attribuer une nouvelle adresse à ce que vous ne puissiez attribuer une nouvelle valeur à 5 . Le fait est des objets existants dans un endroit en mémoire pendant toute leur vie. Leur adresse ne peut jamais changer et il serait illogique d'essayer de changer cela en attribuant une nouvelle adresse à ce . Passer d'un objet déplace la valeur ou état cet objet a ailleurs, mais l'objet lui-même existe toujours à son adresse précédente.


1 commentaires

Ajout: Cela ne peut jamais être nullptr, car appeler une fonction membre sur NullPtr est UB



2
votes

1) Comment ce pointeur est différent des autres pointeurs? P>

Ceci code> est un mot-clé. Il ne peut pas et n'a pas besoin d'être déclaré. Ce code> est implicitement disponible dans des fonctions de membre non statiques. Ce code> fait référence à l'argument d'instance de la fonction de membre. P>

Inversement, les variables du pointeur peuvent et doivent généralement être déclarées. Un exemple de déclaration de pointeur: p> xxx pré>

Comme je comprends que les pointeurs indiquent la mémoire dans le tas. P> BlockQuote>

Vous avez mal compris. Les pointeurs ne se limitent pas à pointer uniquement dans le tas 1 sup>. P>

Est-ce que cela signifie que les objets sont toujours construits dans le tas p> BlockQuote>

Étant donné que votre prémisse est fausse, la réponse reste non à cette question. Les objets ne sont pas limités à être construits uniquement dans le tas 1 sup>. Voici un exemple: P>

void foo() {
    int i;
    int* iptr = &i;
}


0 commentaires