Einige Leute wissen nicht, dass es möglich ist, Strukturen nach Wert in C zu übergeben und zurückzugeben. Meine Frage betrifft den Compiler, der unnötige Kopien erstellt, wenn er Strukturen in C zurückgibt. Verwenden Sie C-Compiler wie GCC Renditeoptimierung (RVO) Optimierung oder ist dies ein reines C++-Konzept? Alles, was ich über RVO und Copy Elision gelesen habe, bezieht sich auf C++.
Betrachten wir ein Beispiel. Ich implementiere gerade eine Double-Double-Datentyp in C (oder eher Float-Float, um damit zu beginnen, weil ich es einfach finde, Komponenten zu testen). Betrachten Sie den folgenden Code.
typedef struct {
float hi;
float lo;
} doublefloat;
doublefloat quick_two_sum(float a, float b) {
float s = a + b;
float e = b - (s - a);
return (doublefloat){s, e};
}
Erstellt der Compiler eine temporäre Kopie der doublefloat
Wert, den ich zurückgebe, oder kann die temporäre Kopie entfernt werden?
Was ist mit der benannten Rückgabewertoptimierung (NRVO) in C? Ich habe eine andere Funktion
doublefloat df64_add(doublefloat a, doublefloat b) {
doublefloat s, t;
s = two_sum(a.hi, b.hi);
t = two_sum(a.lo, b.lo);
s.lo += t.hi;
s = quick_two_sum(s.hi, s.lo);
s.lo += t.lo;
s = quick_two_sum(s.hi, s.lo);
return s;
}
In diesem Fall gebe ich eine benannte Struktur zurück. Kann in diesem Fall auf die temporäre Kopie verzichtet werden?
Es sollte erwähnt werden, dass dies eine allgemeine Frage für C ist und dass die Codebeispiele, die ich hier verwendet habe, nur Beispiele sind (wenn ich dies optimiere, werde ich sowieso SIMD mit Intrinsics verwenden). Mir ist bewusst, dass ich mir die Assembly-Ausgabe ansehen könnte, um zu sehen, was der Compiler tut, aber ich denke, das ist trotzdem eine interessante Frage.
@BaummitAugen, ich war mir auch nicht sicher, ob ich das C++-Tag verwenden soll. Aber ich glaube, ich habe in meiner Frage deutlich gemacht, dass es um C geht. Ich hatte gehofft, dass das C++-Tag Leute anziehen würde, die Experten in beiden Sprachen sind.
– Z-Boson
4. Mai 2015 um 15:45 Uhr
@IvayloStrandjev immer noch die Frage zu C, das Tag gilt für die Frage, nein?
– BeyelerStudios
4. Mai 2015 um 15:46 Uhr
@IvayloStrandjev Die Frage ist: Haben wir RVO in C? Auch wenn die Antwort “Nein” war, trifft das C-Tag definitiv zu, weil er nach C fragt.
– Baum mit Augen
♦
4. Mai 2015 um 15:46 Uhr
@jamesqf: Die offensichtliche Antwort würde beinhalten, dass C durch den C-Standard definiert wird, nicht durch Ihr persönliches mentales Modell.
– Jerry Sarg
5. Mai 2015 um 1:49 Uhr
@jamesqf, die Rückgabe dieser Strukturen nach Wert in meinen Beispielen ist meiner Meinung nach lesbarer und logischer und nicht unbedingt weniger effizient. Früher dachte ich wie du. Das ist der Grund, warum ich diese Frage gestellt habe. Mein mentales Modell von C entwickelt sich weiter. Ich würde jetzt das Gegenargument vorbringen, dass die Verwendung eines Zeigers eine vorzeitige Optimierung und möglicherweise weniger effizient ist (IMHO sollten Sie nur optimieren, was der Compiler nicht kann, nicht was er kann). Darüber denke ich noch nach.
– Z-Boson
5. Mai 2015 um 7:36 Uhr