C++Guns – RoboBlog

02.11.2017

C++ Guns - Addressen von Referenzen

Filed under: Allgemein — Tags: — Thomas @ 12:11

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++.

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress