Haben Referenzen in C++ eigene Adressen, so wie normale Variablen und Pointer, oder haben sie nur die Adresse der referenzierten Variablen?
Wenn Referenzen eigene Adressen besitzen, existieren sie wie normale Variablen im RAM. Ich meine mich aber erinnert zu haben, dass eine Referenz nur ein Alias für eine andere Variable ist. Einfach nur syntactic sugar für den Programmierer. Das wäre natürlich optimal, da unnötige Kopieraktionen entfallen.
Ein kleines Experiment bringt Klarheit:
void func(int& c) { cout << "In func(): Adress of c reference to a: " << addressof(c) << "\n"; c = 1; } int main() { int a = 0; cout << "Value of a: " << a << "\n"; cout << "Adress of a: " << addressof(a) << "\n"; int &b = a; cout << "Adress of b reference to a: " << addressof(b) << "\n"; func(a); cout << "Value of a: " << a << "\n"; }
Value of a: 0 Adress of a: 0x7ffd58cf22b4 Adress of b reference to a: 0x7ffd58cf22b4 In func(): Adress of c reference to a: 0x7ffd58cf22b4 Value of a: 1
Es gibt nur eine einzige Variable im Programm, mit der Adresse 0x7ffd58cf22b4. Es ist egal, ob über eine Referenz darauf zugegriffen wird, oder sogar aus einer Funktion heraus, über eine Referenz, die Variable a manipuliert wird. Es werden nur 4Byte Speicher im RAM belegt. Wunderbar.
Mit Pointer sollte dieser Effekt nicht zu erreichen sein. Da Pointer ja echte Variablen mit eigenen Adressen.
void func(int* c) { cout << "In func(): Adress of c pointer to a: " << addressof(c) << "\n"; *c = 1; } int main() { int a = 0; cout << "Value of a: " << a << "\n"; cout << "Adress of a: " << addressof(a) << "\n"; int* b = addressof(a); cout << "Adress of b pointer to a: " << addressof(b) << "\n"; func(addressof(a)); cout << "Value of a: " << a << "\n"; }
Value of a: 0 Adress of a: 0x7ffc955db71c Adress of b pointer to a: 0x7ffc955db710 In func(): Adress of c pointer to a: 0x7ffc955db6e8 Value of a: 1
Ganz klar zu sehen, jeder Pointer hat eine andere Adresse als Variable a. Es werden also 3*4Byte = 12Byte Speicher im RAM belegt. Plus zusätzliche Kopieraktionen der Adresse von a hin zur Pointervariablen.
Interessanterweise sind Referenzen im C Sprachstandard nicht vorgesehen. Somit ist es nicht möglich, dieses simple Beispiel auf Laufzeit hin optimiert in C zu programmieren. Nur in C++.