C ++ und QT4.5 - übergibt einen Const Int & Overkill? Geht bei Referenzhilfen in Signalen / Slots vorbei?

7

Hier sind zwei Fragen zusammengefasst ...

Ich habe eine Reihe von Funktionen, die für eine Echtzeit-Videoverarbeitungsanwendung mehrfach pro Rahmen aufgerufen werden. Wenn Sie sich über const informieren und als Referenz übergeben, haben die Funktionen eine ähnliche Signatur.

%Vor%

Während ich die paar zusätzlichen Zeichen eintippe, frage ich mich, ob das zu viel ist.

Zweite Frage, nun, zum Thema Pass-by-Reference, innerhalb der Slots / Signale-Mechanismus von QT, passiert durch Verweis hilft, das Kopieren von Objekten wie in einem normalen Funktionsaufruf zu verhindern?

    
Extrakun 26.08.2009, 08:27
quelle

3 Antworten

19

Ja, das ist Overkill und führt zu einem langsameren Code, als wenn Sie den Wert int by übergeben würden. Ein int ist vier Bytes; eine Referenz (im Wesentlichen eine Speicheradresse) ist entweder auch vier Bytes (auf einer 32-Bit-Maschine) oder acht Bytes (auf einer 64-Bit-Maschine). Sie müssen also möglicherweise more Informationen an die Funktion übergeben - und zusätzlich haben Sie den Overhead, diese Referenz zu dereferenzieren.

Wenn Sie etwas größer als ein int übergeben, ist es jedoch effizienter, einen const-Verweis zu verwenden, da Sie nur vier oder acht Bytes übergeben können, anstatt das gesamte Objekt kopieren zu müssen.

Bearbeiten In Bezug auf Qt: Ja, wenn der Slot einen konstanten Verweis auf ein Objekt annimmt, liegt der Grund darin, den Overhead des Kopierens des Objekts zu speichern.

    
Martin B 26.08.2009, 08:31
quelle
7

Ja, Referenzieren hilft beim Kopieren der Objekte. Der Compiler kann jedoch entscheiden, ihn vollständig zu optimieren, und der Wert wird nach Wert übergeben, wenn er den gleichen Effekt erzeugt. Eine solche Optimierung ist normalerweise möglich, wenn sich die Funktion und die Aufrufstelle in der gleichen Übersetzungseinheit befinden, einige Compiler jedoch noch mehr globale Optimierungen durchführen können - Sie können die emittierte Baugruppe bei Bedarf überprüfen.

Aus diesem Grund sollten Sie primitive Typen nicht wirklich als Referenz verwenden, wenn Sie Wert auf Leistung legen und Sie nicht wirklich Gründe dafür haben. Siehe Was nutzt const-Referenzen? primitive Typen? zur Diskussion dieses Problems.

    
sharptooth 26.08.2009 08:31
quelle
4

Erstens - der Unterschied zwischen

  • void processSomething (const int & amp; value);
  • void processSomething (int-Wert);

ist: normalerweise wird eine const-Referenz übergeben, indem ein Zeiger übergeben wird, die andere Sache wird durch Kopieren übergeben. Nach dem Anruf (von der Anruferseite) ist das Ergebnis gleich. Was immer Sie an die Funktion übergeben, wird durch den Aufruf nicht geändert.

Innerhalb der Funktion sehen Sie auch keine Unterschiede (zumindest bei einem int). Bei Objekten können Sie natürlich nur const-Funktionen verwenden.

Auf der Leistungsseite - je nach Compiler und Optimierung kann eine Konstante auf ein int übergeben werden (oder auch nicht). Der Compiler könnte (theoretisch) die Weitergabe der const-Referenz auf einen Wert-Durchgang optimieren, ich weiß nicht, ob es das tut. Das Arbeiten mit Zeigern auf Ints anstelle von Werten ist natürlich langsamer.

Weitere Informationen dazu finden Sie unter: Wann Zeiger zu verwenden sind und wann nicht um sie zu benutzen

Nachdem der andere verknüpfte Post gelesen wurde, kann der Compiler ihn in einer Multithreadumgebung nicht optimieren. Zumindest in einer MT-Umgebung gibt es echte Unterschiede zwischen const int & amp; und int Anrufe. +1 für diesen Link.

    
Tobias Langner 26.08.2009 08:36
quelle