 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Cedric J. 'Ronin' Reinsch Guest
|
Posted: Mon Sep 13, 2004 8:01 am Post subject: Übersetzung von Zeigern und Referenzen |
|
|
Hallo!
Neulich bin ich mit einem Kumpel von mir mal auf etwas Merkwürdiges
gestoßen. Man kann einem Zeiger ja nicht die Adresse eines CPU-Registers
zuweisen, weil dieses ja gar keine Adresse hat:
register int a;
int *preg = &a; // geht nicht
Jedoch:
register int b;
int &rreg = b;
Allerdings werden doch Zeiger und Referenzen gleich übersetzt, oder?
Jedenfalls sagt das objdump von beiden Versionen.
Kann mich hier jemand aufklären?
MfG, Cedric
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Mon Sep 13, 2004 1:42 pm Post subject: Re: Übersetzung von Zeigern und Referenzen |
|
|
Cedric J. 'Ronin' Reinsch wrote:
| Quote: | Neulich bin ich mit einem Kumpel von mir mal auf etwas Merkwürdiges
gestoßen. Man kann einem Zeiger ja nicht die Adresse eines CPU-Registers
zuweisen, weil dieses ja gar keine Adresse hat:
register int a;
int *preg = &a; // geht nicht
|
Das würde ich so nicht sagen.
Zumal das register Keyword für die meisten neueren Compiler ein no-op
ist. Theoretisch richtig ist diese Plausibilitätsprüfung natürlich schon.
| Quote: | register int b;
int &rreg = b;
|
Letzlich obliegt es den Optimierungen des Compilers, im Einzelfall dafür
zu sorgen, daß der & operator, so denn verwendet, funktioniert. Bei
Referenzen könnte aber ebenfalls aus Gründen der Optimierung die ganze
Referenz verschwinden. Dann funktioniert es natürlich wieder.
Aber wie gesagt, da register nur eine Empfehlung an den Compiler ist,
kann er sich im Einzelfall immer dagegen entscheiden.
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Sep 13, 2004 1:56 pm Post subject: Re: Übersetzung von Zeigern und Referenzen |
|
|
"Cedric J. 'Ronin' Reinsch" wrote:
| Quote: |
Hallo!
Neulich bin ich mit einem Kumpel von mir mal auf etwas Merkwürdiges
gestoßen. Man kann einem Zeiger ja nicht die Adresse eines CPU-Registers
zuweisen, weil dieses ja gar keine Adresse hat:
register int a;
int *preg = &a; // geht nicht
Jedoch:
register int b;
int &rreg = b;
Allerdings werden doch Zeiger und Referenzen gleich übersetzt, oder?
|
Eine Referenz *ist* *kein* Zeiger.
Eine Referenz ist ein anderer Name fuer ein Objekt. Punkt.
Wie der Compiler das realisiert bleibt ihm ueberlassen. Wenn er
in manchen Faellen einen Pointer benutzt um die geforderte Semantik
realisieren zukoennen, toll. Wenn er sich aber nur in seinen internen
Tabellen vermerkt wofuer die Referenz steht, und den Austausch quasi
'on the fly' waehrend des kompilierens macht, wenns get, - auch gut.
| Quote: | Jedenfalls sagt das objdump von beiden Versionen.
Kann mich hier jemand aufklären?
|
Eine Referenz hat eine geforderte Semantik. Im obigen Beispiel
braucht der Compiler keinen 'versteckten' Pointer. Es genuegt
voellig wenn er sich in einer Compiler internen Tabelle vermerkt,
dass 'rreg' und 'b' ein und dieselbe Variable sind. Wann immer Du 'rreg'
verwendest, tauscht der Compiler 'rreg' sofort gegen 'b' aus und macht
damit weiter. Dazu braucht er nichts weiter als eine Tabelle die nur
zur Compilezeit existiert.
Referenzen sind keine Pointer, auch keine 'versteckten'. Referenzen
sind alternative Namen fuer Objekte. Wie der Compiler diese 'Magie'
realisiert, ist seine Sache (Und in vielen Faellen wird dafuer
tatsaechlich ein fuer dich nicht sichtbarer Pointer zum Einsatz kommen.
Der springende Punkt ist: kann - muss aber nicht)
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Martin Kaul Guest
|
Posted: Mon Sep 13, 2004 2:03 pm Post subject: Re: Übersetzung von Zeigern und Referenzen |
|
|
Cedric J. 'Ronin' Reinsch wrote:
| Quote: | Hallo!
Neulich bin ich mit einem Kumpel von mir mal auf etwas Merkwürdiges
gestoßen. Man kann einem Zeiger ja nicht die Adresse eines CPU-Registers
zuweisen, weil dieses ja gar keine Adresse hat:
register int a;
int *preg = &a; // geht nicht
Jedoch:
register int b;
int &rreg = b;
Allerdings werden doch Zeiger und Referenzen gleich übersetzt, oder?
Jedenfalls sagt das objdump von beiden Versionen.
|
Hmm, ich bin kein Standard-Freak, aber:
Beispiel:
------------------------------------------
int testfunc( void )
{
register int a;
int *preg = &a; // geht nicht
a = 0;
a++;
return a;
}
------------------------------------------
Die Angabe register ist eine Empfehlung an den Compiler, d.h
der Compiler kann sich dran halten oder nicht.
Ich habe mal das erste Beispiel mit gcc V 3.3 (fürn SH) ohne Optimierung
übersetzt
a.) *ohne* "int *preg = &a;" kommt folgender
Assembler Code raus:
mov #0,r1 // a (d.h. r1) = 0;
add #1,r1 // a++;
mov r1,r0 // return a;
Register r0 ist bei dem Controller klassischerweise
das Rückgaberegister
b.) *mit* "int *preg = &a;" kommt folgender
Assembler Code raus:
mov #0,r1 // a (d.h. @r14) = 0;
mov.l r1,@r14
mov.l @r14,r1 // a++;
add #1,r1
mov.l r1,@r14
mov.l @r14,r1 // return a;
mov r1,r0
man sieht, dass er die Anweisung "register" ignoriert und
alle Änderungen von a immer auf den Stack (r14 zeigt auf den
Stack - @r14 dereferenziert quasi den "Zeiger") schreibt.
Bei deiner Variante mit Referenzen hab ich im Assembler keinen
Unterschied gesehen.
Beide deiner Varianten werden vom gcc ohne Beanstandung kompiliert.
tschaule
Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Sep 14, 2004 11:12 am Post subject: Re: Übersetzung von Zeigern und Referenzen |
|
|
"Cedric J. 'Ronin' Reinsch" <cedric_r (AT) gmx (DOT) de> wrote
| Quote: | Neulich bin ich mit einem Kumpel von mir mal auf etwas Merkwürdiges
gestoßen. Man kann einem Zeiger ja nicht die Adresse eines
CPU-Registers zuweisen, weil dieses ja gar keine Adresse hat:
register int a;
int *preg = &a; // geht nicht
|
Warum sagst Du, dass es nicht geht. Laut Norm ist »register« nur ein
Hinweis, dass die Variable besonders häufig benutzt werden. Es hat keine
andere Wirkung; ob »register« oder »auto« oder gar nichts (bei einem
Parameter oder einer lokalen Variable) sind die Semantik und die
erlaubten Operationen genau indentisch.
| Quote: | Jedoch:
register int b;
int &rreg = b;
Allerdings werden doch Zeiger und Referenzen gleich übersetzt, oder?
|
Je nach dem. Wenn beide lokalen Variablen sind, ist es
wahrscheinlicher, dass die Referenz gar nicht im generierten Code
auftaucht.
Es ist freilich höchst unwahrscheinlich, dass die Variable tatsächlich
in einem Register gesteckt wird, wenn man seine Adresse nimmt oder ihr
z.B. per Referenz an eine andere Funktion übergibt.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|