"T" vs "const T &"
-
hi,
bei einem blöden compiler würde man ja erwarten, dass die funktionsdeklaration
void f( const T & argument );effizienteren code liefert, als
void f( T argument);, weil der compiler dann merkt, dass er einen zeiger benutzen kann, und nicht kopieren braucht. was ist aber bei einem optimierenden compiler? kann es sein, dass ihn das nur "verwirrt"?
-
Es sind Fälle denkbar, in denen der Compiler den die Kopie wegoptimieren kann. Dafür muß die Implementierung des Copy-Konstruktors aber zum compile-Zeitpunkt bekannt sein. Ist es in einer separaten Compile-Einheit, also in einer anderen cpp-Datei, weiß der Compiler nicht, ob der Copy-Konstruktor nicht irgendwelche gewollten Nebeneffekte hat. Daher muß der Compiler den Copy-Konstruktor aufrufen.
Der erste Fall ist da eindeutig.
-
Crockett schrieb:
...kann es sein, dass ihn das nur "verwirrt"?
Wie sollte sowas einen Compiler "verwirren" ?
Der Programmierer gibt maximal viele Angaben mit ... sollte eigentlich her einfacher für einen Compiler sein.Gruß,
Simon2.
-
Simon2 schrieb:
Wie sollte sowas einen Compiler "verwirren" ?
Der Programmierer gibt maximal viele Angaben mit ... sollte eigentlich her einfacher für einen Compiler sein.naja, zum beispiel könnte ein bugfix für das behandeln von referenzübergaben aus dem jahr 1976 eine optimierung von solchen aufrufen verhindern. oder so.
-
Crockett schrieb:
Simon2 schrieb:
Wie sollte sowas einen Compiler "verwirren" ?
Der Programmierer gibt maximal viele Angaben mit ... sollte eigentlich her einfacher für einen Compiler sein.naja, zum beispiel könnte ein bugfix für das behandeln von referenzübergaben aus dem jahr 1976 eine optimierung von solchen aufrufen verhindern. oder so.

Naja, es könnte einem auch ein Dachdecker unters Auto fallen....
Ich halte es für höchst unwahrscheinlich, dass ein Compiler mit const-Referenzen mehr Probleme hat als mit "call-by-value". Andersherum könnte ich mir vorstellen, dass ein übereifriger Optimizer fälschlicherweise eine temporäre Variable entfernt, wo er das nicht dürfte/sollte.
Ich werde mich jedenfalls nicht vom "const-reffen" abbringen lassen.
Gruß,
Simon2.
-
Ein Standardkonformer Compiler dürfte den by-value call eh nicht in einen by-reference call ändern by non-PODs. Denn er kann ja nicht wissen was im Copy-Ctor wirklich abläuft.