2012-05-04 19 views
8

Auf einer 32-Bit-Maschine bekomme ich immer die sizeof eines Verweises 4 Bytes, auch wenn es sich um einen Verweis auf einen Doppel ist, was speichert es wirklich in diesen 4 Bytes.warum Referenzgröße ist immer 4 Bytes - C++

EDIT:

class A{ 
public: 
    double& a; 
}; 

int main(){ 
    cout << sizeof(A) << endl; // this will print out 4 
} 
+8

Sie können nicht die Größe einer Referenz erhalten, weil eine Referenz kein Objekt ist. Bitte zeigen Sie uns, mit welchem ​​Code Sie testen. –

+0

warum die negativen stimmen? – AlexDan

+3

Weil deine Frage keinen Sinn ergibt. Wie @ R.MartinhoFernandes sagt, können Sie nicht die Größe einer Referenz erhalten. Also, es sei denn, du postest einen Code, der zeigt, was du * tust *, wir haben keine Ahnung, was du fragst oder wie du antworten kannst. – jalf

Antwort

30

Der Standard ist ziemlich klar auf sizeof (C++ 11, 5.3.3/4):

Wenn Typ einer Referenz oder einer Referenz angewendet Das Ergebnis ist die Größe des referenzierten Typs.

Also, wenn Sie wirklich sizeof(double&) einnehmen, wird der Compiler Sie sagen, dass sizeof(double) 4.

-Update ist: Also, was Sie wirklich tun, ist sizeof zu einer Klasse-Typ angewendet wird. In diesem Fall

Wenn auf eine Klasse angewandt wird, ist das Ergebnis die Anzahl von Bytes in einem Objekt dieser Klasse [...]

So wissen wir, dass das Vorhandensein des Referenz innerhalb A verursacht es 4 Bytes zu belegen. Obwohl der Standard nicht vorschreibt, wie Referenzen implementiert werden sollen, muss der Compiler sie trotzdem irgendwie implementieren. Dies kann je nach Kontext sehr unterschiedlich sein, aber für ein Referenzmitglied eines Klassentyps ist der einzige Ansatz, der Sinn macht, ein double* hinter Ihrem Rücken zu schleichen und es in Ihrem Gesicht double& zu nennen.

Also, wenn Ihre Architektur 32-Bit ist (in denen Zeiger 4 Bytes lang sind), würde das das Ergebnis erklären.

Denken Sie daran, dass das Konzept einer Referenz nicht an eine bestimmte Implementierung gebunden ist. Der Standard ermöglicht es dem Compiler, Referenzen zu implementieren, wie er es auch möchte.

19

Sie können nicht, und es ist nicht.

Eine C++ - Referenz ist nicht ein Zeiger. Es ist ein Alias ​​eines Objekts. Manchmal, der Compiler wählt das mithilfe eines Zeigers zu implementieren. Aber oft implementiert es es durch überhaupt nichts tun. Erzeugen Sie einfach einen Code, der direkt auf das ursprüngliche Objekt verweist.

In jedem Fall angewendet sizeof auf einen Referenztyp nicht, dass Sie die Größe eines Referenz nicht geben. Es ist also nicht wirklich klar, was du tust, was es unmöglich macht zu erklären, was passiert.

bearbeiten

Nun, da Sie einige Code gezeigt haben, können wir die Frage beantworten:

Sie die Größe einer Klasse, die einen Verweis enthält.Wie ich oben sagte, ist eine Referenz kein Zeiger, aber wenn nötig, kann der Compiler darauf zurückgreifen, einen Zeiger zu verwenden, um ihn darzustellen. Wenn Sie eine Klasse erstellen, die eine Referenz enthält, kann der Compiler sie nur so implementieren, dass eine Klasse definiert wird, die die Adresse eines Objekts enthält. Auf 32-Bit-Systemen sind Adressen 32 Bit oder 4 Byte breit. So sizeof solch eine Klasse wird (in der Regel) 4.

+0

Falsch auf so vielen Ebenen. "Manchmal entscheidet sich der Compiler dafür, dies mit einem Zeiger zu implementieren. Aber oft implementiert er es, indem er gar nichts tut." Das unterscheidet sich in keiner Weise von einer Ganzzahl oder irgendetwas anderem. Wenn Sie nicht zustimmen, dass "int i = 1;" nichts deklariert (zumindest wenn Sie 'i' später nicht ändern), können Sie nicht sagen, dass eine Referenz überhaupt nichts ist. – jpalecek

+14

Sicher kann ich. Wenn Sie so etwas tun: 'int i = 0; int & r = i ', dann erzeugen Compiler typischerweise * keinen * Code zum Setzen eines Zeigers auf "i" auf dem Stapel. Stattdessen geben nachfolgende Operationen auf "r" (sagen wir, "r ++") nur den exakt gleichen Code aus, als hätten Sie "i ++" geschrieben. Eine Referenz ist nur ein Alias. – jalf

+0

Eine Referenz ist genau ein Zeiger. Jede Optimierung, die ein Compiler mit 'int i; int & r = i', kann es mit 'int i; int * r = & i '. Jede Optimierung, die mit einem Zeiger nicht möglich ist, kann mit einer Referenz nicht gemacht werden. Das Problem des Zeiger-Aliasing ist auch vollständig mit Referenzen vorhanden. –

Verwandte Themen