Wenn in C ++ ein Eingabeargument billig zu kopieren ist (z. B. wie ein int
, float
usw.), wird es normalerweise einfach nach Wert übergeben . Stattdessen werden "beobachtete" Argumente, die nicht billig zu kopieren sind (z. B. std::string
), von const &
übergeben.
Ich habe mich über Typen wie einen POD gewundert, der einen 2D-Vektor mit int
-Koordinaten repräsentiert, z.B.
Auf 32-Bit-MSVC-Compiler sind es nur 8 Byte ( 2 * sizeof(int)
). Würden Sie es nach Wert oder nach const &
übergeben?
Und was ist mit einem Vec2d
mit double
-Koordinaten?
(Bei MSVC wäre es 2 * sizeof(double)
, also 2 * 8 = 16
bytes.)
Gibt es einen "Größenschwellenwert" (zB 16 Bytes?) für eine Zeile und sagen: "für PODs über Größe X an const &
übergeben und für kleinere PODs übergeben nach Wert "?
PS: Bitte verwenden Sie keine Argumente als "vorzeitige Optimierung" in Antworten.
Dies klingt für mich wie der Fall von ++it
vs. it++
(wobei it
ein STL-Iterator ist): Es ist nicht so, dass ++it
eine vorzeitige Optimierung ist, der Punkt ist, dass it++
ein ist vorzeitige Pessimierung :)
Hinter den Kulissen ist ein treibender Faktor, ob es möglich ist, eine Variable in einem oder mehreren Registern zu übergeben. Im 20. Jahrhundert waren Compiler ziemlich gut, wenn ein Argumenttyp direkt auf ein Register abgebildet wurde. Das Übergeben einer Struktur mit zwei Mitgliedern in einem Registerpaar ist eine Optimierung des 21. Jahrhunderts.
Wie du in deinen Kommentaren x86 nennst, ist das ein Sonderfall. Es ist registerbehaftet und möglicherweise kein Registerpaar für die Übergabe von Argumenten verfügbar. Sowohl x86 als auch ARM sind in dieser Hinsicht viel besser, einer der Gründe, warum x64 oft schneller und ARM leistungsfähiger ist
boost::call_traits<T>
ist ein Versuch, herauszufinden, ob es klug ist, T
als Referenz zu übergeben, aber es ist nicht perfekt.
Tags und Links c++ parameter-passing pass-by-value