Werden (zurückgegebene) Referenzen immer total wegoptimiert?
-
Hi!
Ich frage mich, ob hier zB. "myData" Speicher oder sonst irgendwelche Resourcen verbraucht. Kann/Wird sowas immer wegoptimiert?
unsigned char data[] = { 1, 2, 3 }; unsigned char* pData = data; unsigned char*& myData = pData; // myData[0] = ...Und wie ist es mit Referenzen, welche von Funktionen zurückgegeben werden? Man denke an Konstrukte wie...
SomeClass::GetInstance()->GetObj1().GetObj2()->SetSomething(123);
Würden da jetzt wirklich alle Funktionen aufgerufen werden, oder kann/wird das zu "obj2->SetSomething(123);" optimiert? Ist es abhängig von dem Rückgabetyp?
Aber die Funktionen könnten ja noch mehr machen als nur irgendeine Instanz zurückzugeben. Erkennt das ein guter Compiler?

-
Deoptimierer schrieb:
Ich frage mich, ob hier zB. "myData" Speicher oder sonst irgendwelche Resourcen verbraucht. Kann/Wird sowas immer wegoptimiert?
unsigned char data[] = { 1, 2, 3 }; unsigned char* pData = data; unsigned char*& myData = pData; // myData[0] = ...Mit C++ hat das nicht viel zu tun (C++ gesteht myData nicht den Status eines Objekts zu, das sagt aber nichts über die Umsetzung aus), aber in deinem Beispiel ist das eine simple copy propagation, also würde ich erwarten, dass jeder ernsthafte Compiler zumindest myData und pData identifiziert. Abhängig davon, was du mit pData treibst, kann sogar dieser Zeiger wegfallen und durch data ersetzt werden.
Und wie ist es mit Referenzen, welche von Funktionen zurückgegeben werden? Man denke an Konstrukte wie...
SomeClass::GetInstance()->GetObj1().GetObj2()->SetSomething(123);
Würden da jetzt wirklich alle Funktionen aufgerufen werden, oder kann/wird das zu "obj2->SetSomething(123);" optimiert? Ist es abhängig von dem Rückgabetyp?
Das hängt davon ab, ob der Compiler sehen kann, was die Funktionen machen. inline wäre da schonmal von Vorteil. Wie gut Link-Time-Code-Generation ist (was erforderlich wäre, wenn die nicht inline sind) weiß ich nicht, aber da gilt dann prinzipiell dasselbe.
Aber die Funktionen könnten ja noch mehr machen als nur irgendeine Instanz zurückzugeben. Erkennt das ein guter Compiler?
Das ist zwar denkbar, aber ich kann mir nicht vorstellen, dass Compiler derartige Informationen sammeln. Die Funktion wird geinlinet und dann wird geschaut, ob sich da irgendwas vereinfachen lässt.
(edit: i.A. ist das natürlich keine Konstantenpropagation)