übergeben - referenzparameter c++




c++ Übergabe von Argumenten durch Referenz und Zeiger (3)

in C ++

class bar
{
    int i;
    char b;
    float d;
};

void foo ( bar arg );
void foo ( bar &arg );
void foo ( bar *arg );

Dies ist eine Beispielklasse / Struktur und Funktionen
Ich habe ein paar Fragen

  • Was ist der Unterschied zwischen 1. und 2. Art, das Argument in 'asm', Größe, Geschwindigkeit zu übergeben?
  • wie die Argumente in jedem Fall an die Funktionen foo übergeben werden (im Falle eines Zeigers weiß ich, dass der Zeiger auf den Stapel geschoben wurde)
  • wenn Argumente übergeben, in Bezug auf die Effizienz (Geschwindigkeit, Größe, Präferenz), die besser ist?
  • Was ist die "asm" -Syntax von Intel, die den einzelnen Argumenten entspricht?

Ich weiß, was die meisten sagen: "Es spielt keine Rolle bei modernen Compilern und CPUs", aber was ist, wenn wir über alte CPUs oder Compiler sprechen?

Danke im Voraus


Der Zeiger und die Referenzmethoden sollten ziemlich vergleichbar sein (sowohl in Bezug auf Geschwindigkeit, Speichernutzung und generierten Code).

Durch das direkte Übergeben einer Klasse wird der Compiler gezwungen, den Arbeitsspeicher zu duplizieren und eine Kopie des Balkenobjekts auf den Stapel zu legen. Was noch schlimmer ist, in C ++ gibt es alle Arten von ekligen Bits (der Standard-Copy-Konstruktor und whatnot) damit verbunden.

Verwenden Sie in CI immer (möglicherweise const) Zeiger. In C ++ sollten Sie wahrscheinlich Referenzen verwenden.


Die Funktion foo kann arg in den Fällen 2 und 3 modifizieren. In ersten Fällen könnte der Compiler die Erstellung von Kopien optimieren, daher ist es sehr schwierig, die CPU- und Speichernutzung zu vergleichen.


Zeiger und Referenzen unterscheiden sich syntaktisch und sind in der Laufzeit und Codegenerierung idR identisch. Was ältere Compiler angeht ... Ich kannte einen Fehler im Borland 3 C ++ DOS-Compiler: Er hat einen int-Wert zwischengespeichert (durch Verweis übergeben), ihn verändert und den ursprünglichen Wert im Speicher nicht verändert. Beim Passieren eines Zeigers funktionierte ein äquivalenter Code wie erwartet.

Ich glaube jedoch nicht, dass ein moderner Compiler so seltsame Dinge tun könnte (und Borland 5 hat das Problem behoben)

Was den Codestil anbelangt (abgesehen von einem Kompromiss zwischen Zeigern und Smartpointern), verwende ich normalerweise Referenzen, wenn die Adresse nicht durch den Funktionskontrakt NULL sein kann, und verwende ansonsten Zeiger.





arguments