Prendiamo questo semplice programma c ++ come esempio:
#include <vector>
class A
{
void fun() { a = this + 1; }
A* a;
};
main()
{
std::vector<A> vec;
vec.resize(100);
}
Dimenticando per il momento che this
è un puntatore a qualche istanziazione di A
, questa domanda riguarda la variabile this
stessa, e dove è memorizzato il suo contenuto (il valore dell'indirizzo di memoria).
Non può essere un valore letterale perché il compilatore non può conoscere la posizione della classe A
, quindi il suo contenuto deve essere allocato da qualche parte sullo stack o heap come variabile. In questo caso le istanze di A
sono allocate nell'heap; significa che il puntatore this
si trova anche nell'heap?
Guardando la chiamata di resize
di vec
, un compilatore potrebbe fare qualcosa di simile sotto il cofano:
std::vector<A>::resize(this, 100); // where 'this' is a pointer to vec
Quindi la mia domanda è, da dove viene il puntatore this
? Vale a dire. dov'è il contenuto di this
(il valore dell'indirizzo di memoria a 32/64 bit) memorizzato in memoria per essere passato a questo metodo?
Supporrei che non possa essere un membro normale; quindi il mio primo pensiero è stato che si tratta di una variabile globale mutilata di qualche tipo, ma poi memorizzandone un numero sconosciuto in un vettore non vedo come il compilatore possa ottenere questo risultato. Dov'è il contenuto della variabile this
memorizzata in relazione al contenuto del membro della classe A
a cui si riferisce?
Se lo standard ha qualcosa da dire su questo, preferirei una risposta con riferimento allo standard.
Si noti che la ragione che voglio sapere è perché sono preoccupato della condivisione errata della memoria allocata per l'oggetto this
se modifico le variabili membro. La conoscenza di dove è memorizzato l'oggetto this
potrebbe influire sulle decisioni di padding.