Größe einer Referenz?



  • Kann mir jemand sagen wie groß eine Referenz ist? Hängt dass von ihrem Typ ab? Ne oder? Eine Referenz muss doch nur einen "Lageplan" von der Position der Variable haben, auf die sie zuweist. Sie muss wissen wo diese liegt und dann ihren Wert ausgeben können?

    MfG
    Stromberg


  • Administrator

    Eine Referenz ist im Sinne von C++ nur ein Alias. Eine Referenz an sich gibt es als Objekt somit nicht, ist also nicht mit einem Zeiger zu vergleichen. Daher gibt sizeof bei einer Referenz die Grösse des Objektes zurück, dessen Alias sie ist.

    double d;
    double& r = d;
    sizeof(r); // Gibt 8 zurück, weil ein double nunmal 8 Bytes benötigt,
               // bzw. die Variable d 8 Bytes Speicher beansprucht.
    

    Also grundsätzlich darf man schon sagen, dass die Grösse von ihrem Typ abhängt 😉

    Grüssli



  • Hallo

    Die Größe einer Referenz selbst ist die gleiche wie die von Zeigern, da Refererenzen nur syntaktisch vereinfachte Zeiger sind. Du kannst es also selber bestimmen :

    std::size_t psize = sizeof(void*);
    

    bis bald
    akari



  • Dravere schrieb:

    Eine Referenz ist im Sinne von C++ nur ein Alias. Eine Referenz an sich gibt es als Objekt somit nicht, ist also nicht mit einem Zeiger zu vergleichen. Daher gibt sizeof bei einer Referenz die Grösse des Objektes zurück, dessen Alias sie ist.

    double d;
    double& r = d;
    sizeof(r); // Gibt 8 zurück, weil ein double nunmal 8 Bytes benötigt,
               // bzw. die Variable d 8 Bytes Speicher beansprucht.
    

    Also grundsätzlich darf man schon sagen, dass die Grösse von ihrem Typ abhängt 😉

    Grüssli

    😕 Bei mir gibt das 4 zurück. Kann es sein, dass du ein 64 Bit System hast? sizeof(Ref) ist doch == sizeof(ptr).


  • Administrator

    sicher schrieb:

    😕 Bei mir gibt das 4 zurück. Kann es sein, dass du ein 64 Bit System hast? sizeof(Ref) ist doch == sizeof(ptr).

    Das habe ich so gelernt ... aber ich habe es gleich mal getestet.
    MSVS2005 32 Bit System mit dem folgenden Code:

    #include <iostream> 
    
    int main() 
    { 
    	double d = 0.0;
    	double& r = d;
    
    	std::cout << sizeof(r) << std::endl;
    
    	test::wait("");
    
    	return 0;
    }
    

    Das gibt bei mir ganz klar 8 aus! Probiert es mal aus. Es darf ja auch irgendwie nicht anders sein, weil eine Referenz, wie schon gesagt, gar kein Objekt ist, im gegensatz zu einem Zeiger.

    Grüssli



  • Bei mir wird ebenfalls die Größe des referenzierten Typs zurückgegeben.

    int main()
    {
    	char array[32];
    	char (&ref)[32] = array;
    	std::cout << sizeof (ref); // 32
    }
    


  • Tatsächlich. Dann zeigt der Debugger was falsches an. Warum?

    Visual C++ 2008 Debugger schrieb:

    sizeof(double&) 4 unsigned int
    sizeof(double) 8 unsigned int


  • Administrator

    sicher schrieb:

    Tatsächlich. Dann zeigt der Debugger was falsches an. Warum?

    Wie hat der Debugger das denn angezeigt? Welchen Code hast du dafür ausgeführt?

    Ich habe es gerade noch auf dem aktuellesten MinGW (g++) Kompiler ausgeführt. Da kommt bei mir definitiv auch 8 dabei raus. Macht auch absolut Sinn in meinen Augen 😉

    Ich habe leider keinen Standard zur Verfügung, kann da somit nicht irgendwie mit einem Zitat daraus untermauern. Ich habe es allerdings nie anders gelernt und auch nie anders erlebt.

    Grüssli



  • In der Konsole wird bei mir auch 8 ausgegeben, aber wenn ich es in das "Überwachen" Fenster des Debuggers eingebe, zeigt das 4 an.



  • sicher schrieb:

    In der Konsole wird bei mir auch 8 ausgegeben, aber wenn ich es in das "Überwachen" Fenster des Debuggers eingebe, zeigt das 4 an.

    Das ist korrekt. sizeof gibt 8 zurück, weil es der Standard so verlangt. Das Fenster "Überwachen" hingegen hat mit dem Standard nichts mehr zu tun und zeigt dir die Repräsentation deiner Referenz physikalisch - und das ist nunmal ein normaler Zeiger, auf einem 32Bit System 4 Bytes oder auf einem 64Bit System 8 Bytes.

    MfG


Anmelden zum Antworten