c++ übergabe von Argumenten per Referenz und Zeiger
in c++
class bar
{
int i;
char b;
float d;
};
void foo ( bar arg );
void foo ( bar &arg );
void foo ( bar *arg );
dies ist ein Beispiel-Klasse/struct und Funktionen
ich habe einige Qs
- was ist der Unterschied zwischen 1. und 2. Art der übergabe das argument in 'asm', Größe, Geschwindigkeit ?
- wie die Argumente übergeben werden, um die Funktionen foo in jedem Fall ( im Fall der Zeiger kenne ich den Zeiger auf den stack geschoben wird )
- wenn Argumente übergeben, in Bezug auf die Effizienz ( Geschwindigkeit, Größe, preferability ) was ist besser ?
- was ist die intel 'asm' die syntax entspricht jeder der Wege der übergabe von Argumenten ?
ich weiß was die meisten sagen über "es ist egal, auf moderne Compiler und Prozessoren," aber was ist, wenn wir reden über Alte CPUs oder Compiler?
vielen Dank im Voraus
InformationsquelleAutor der Frage VirusEcks | 2011-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Zeiger und die Referenz-Methoden sollten durchaus vergleichbar (sowohl in der Geschwindigkeit, die Speichernutzung und den generierten code).
Übergabe einer Klasse direkt zwingt den compiler, um doppelten Speicher und legen Sie eine Kopie der
bar
Objekt auf dem stack. Was ist schlimmer, in C++ gibt es alle Arten von nasty bits (die Standard-copy-Konstruktor und so weiter) im Zusammenhang mit dieser.In C verwende ich immer (möglicherweise const) Zeiger. In C++ sollten Sie wahrscheinlich verwenden Sie Referenzen.
InformationsquelleAutor der Antwort cnicutar
In jeder angemessenen Art und Weise der übergabe by reference wird wahrscheinlich im code mit Adressen von Objekten. Jedoch, das wichtigste Problem ist, dass die Verwendung von Referenzen ist mehr idiomatischer C++ und sollte die bevorzugte Stil; Sie sollte nicht wirklich sehen raw-Zeiger eine Menge auf dem alle in Ihrem eigenen code.
Beachten Sie auch, dass die übergabe per Wert und per Referenz ist grundlegend in dem Sinne, dass die übergabe per Referenz erlaubt es der aufgerufenen Funktion zu ändern, das argument. Wenn überhaupt, sollten Sie den Vergleich
f(bar)
mitf(const bar &)
.InformationsquelleAutor der Antwort Kerrek SB
Zeiger und Referenzen unterscheiden sich syntaktisch und in der Regel identisch sind, in der Laufzeit und code-Generierung. Wie zu älteren Compilern... ich wusste, dass ein bug im Borland 3 C++ - compiler: es zwischengespeicherten einen int-Wert (Referenz übergeben) in ein register, geändert hat und nicht ändern den ursprünglichen Wert im Speicher. Bei der übergabe durch Zeiger eine entsprechende code wie erwartet funktioniert.
Aber ich glaube nicht, dass jeder moderne compiler tun können, solche seltsamen Dinge (und Borland 5 hat das Problem behoben wurde)
Als code-Stil (abgesehen von Zeiger vs. smartpointers Kompromiss), normalerweise verwende ich Referenzen, wenn die Adresse kann nicht NULL sein, von der Funktion Vertrag, und verwenden Sie die Zeiger sonst.
InformationsquelleAutor der Antwort user396672
Funktion foo ändern können arg in den Fällen 2 und 3. In ersten Fällen compiler könnte optimieren der Kopie-Erstellung, so ist es sehr schwer zu vergleichen, cpu-und Speichernutzung.
InformationsquelleAutor der Antwort ton4eg