2015-07-20 6 views
13
int x = 10; 
int& y = x; 

Dazu x als 2/4/8 Bytes auf dem Stapel zugeordnet und 00 ... 1010 zu diesen Bytes geschrieben. Wie sieht das Speicherlayout und sein Inhalt für y aus?Wie sind Referenzen in C++ kodiert?

+4

Niemals davon ausgehen, dass es vier Bytes ist. Es könnte acht sein. Referenzen sind * theoretisch * nur eine Annehmlichkeit für den Programmierer. In diesem Fall sind "x" und "y" dasselbe, nur unterschiedliche Namen. In der Praxis, wer weiß. Es kann mehrere Kopien von "10" geben, wenn der Compiler das für hilfreich hält. Denken Sie daran, dass * Variablen * niemals Speicherplatz belegen, sondern nur die Werte, die sie repräsentieren. – tadman

+7

AFAIK der C++ - Standard schreibt nur vor, dass eine Referenz ein Alias ​​für ein anderes Objekt sein soll und nicht erfordert, dass sie in einer bestimmten Art und Weise implementiert wird, also sollten Sie sich nicht darauf verlassen. – Borgleader

+3

@Borgleader Das stimmt, obwohl sie sich wie konstante Auto-Dereferenzierungs-Zeiger verhalten – KABoissonneault

Antwort

27

Aus dem C++ 11-Standard 8.3.2.4 [dcl.ref]

Es ist nicht spezifiziert, ob oder ob nicht eine Referenz erfordert Speicher

So kann es oder darf keinen Speicher benötigen.

13

Lassen Sie mich zitieren http://en.cppreference.com/w/cpp/language/reference:

Referenzen sind keine Objekte; sie belegen nicht notwendigerweise den Speicher , obwohl der Compiler Speicher zuweisen kann, wenn es notwendig ist, die gewünschte Semantik zu implementieren (z. B. ein nicht statischer Datenelement des Referenztyps erhöht normalerweise die Größe der Klasse um den zum Speichern erforderlichen Wert ) eine Speicheradresse)

+0

verdammt, du schlägst mich dazu :) – ydobonebi

4

Aus der Perspektive von C++ Sprache ist es nicht definiert.

In der Praxis behandeln Compiler Referenzen in der Regel genau wie Zeiger, obwohl sie in C++ viele verschiedene Eigenschaften haben. Dies bedeutet, dass die Adresse der referenzierten Variablen physikalisch gespeichert wird. Vielleicht ist die einzige Annahme, die der Compiler machen kann, dass die Referenz nicht null ist. Trotzdem denke ich, dass Sie nicht auf die Adresse zugreifen können, die in der Referenzvariablen in C++ - Code gespeichert ist, ohne zuerst einen Zeiger zu nehmen.

Beachten Sie, dass der Compiler die Referenzvariable oft optimieren kann, sodass Sie nicht einmal sagen können, wo sich diese in der Assembly befindet. Und es kann dasselbe für Zeigervariablen tun.

+1

Vergiss nicht, dass Referenzen Lebenserwartung verlängern können; In diesen Fällen wäre der Speicher für das gesamte Objekt: { Objekt & mein_objekt = Object(); // Mein_Objekt lebt für den ganzen Block } – Lucretiel

+0

Sind Sie sicher, dass Referenzen die Lebensspanne über einen einzelnen Ausdruck hinaus verlängern können? Das sieht für mich so aus, als wäre es eine unverbindliche Referenz. –

+0

@Lucretiel [tun Sie das nicht] (http://stackoverflow.com/questions/13826897/why-not-non-const-reference-to-temporary-objects) – NathanOliver