Antwort

7

Sie können nicht. Es ist so einfach. RVO/NRVO ist Standard, und Ihr Code sollte nicht davon abhängen, dass er nicht vorhanden ist.

+3

Soweit ich weiß, ist RVO/NRVO ** nicht ** der Standard (siehe C++ 0x Standard, Abschnitt 12.8. Kopieren und Verschieben von Klassenobjekten, Absatz 32). Der Standard erlaubt einfach solche Optimierung (g ++ und VisualStudio implementiert es). Ich habe kein Problem damit. Aber es wäre schön, einen Schalter zu haben, um ihn zu deaktivieren. Für Bildungszwecke vielleicht. Danke, es ist jetzt viel klarer :) – Goran

+0

@Goran: Wenn der Standard es ausdrücklich erlaubt, dann ist es Standard. – Puppy

+2

Zulassen! = Erforderlich. Als solches gehört es nicht zum Standard, es widerspricht dem Standard nicht. –

1

Versuchen Sie, Ihre Variable als volatile zu definieren, löst vielleicht Ihr Problem. Wenn nicht, sollten Sie come code senden ...

+0

+1; Obwohl dies nur eine zufällige Vermutung ist (und als solche die Downvotes verdient), ist es korrekt, dass 'return my_volatile_variable;' RVO deaktiviert. (C++ 11 §12.8/31 Punkt 1.) – Potatoswatter

+0

@Potatoswatter: Ich bin neugierig, warum Sie meine Antwort nur als eine zufällige Schätzung gedacht haben. Das "Vielleicht" in meiner Antwort bedeutete, dass ich mir dieser Antwort nicht sicher war, weil ich nicht wusste, was das eigentliche Problem war. IMHO, diese Frage ist im Sinne von http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Malkocoglu

+0

Ah, tut mir leid. Ich nehme an, das ist der Grund, warum sie dich herabgestuft haben. (Es ist besser, eine Antwort mit "flüchtig" zu begründen.) – Potatoswatter

0

Es gibt nie einen Grund, diese Optimierung zu deaktivieren! Was versuchst du zu erreichen? Es hilft Debug-Builds schneller ohne irgendwelche negativen Nebenwirkungen. Es stellt auch sicher, dass der von RVO oder NRVO abhängige Code in Debugging und Release identisch funktioniert.

+11

Ich kann mir einen (zumindest für mich) sehr wichtigen Grund vorstellen: Bildung! Wie erklären Sie Konstruktoren, Konstruktoren, Destruktoren in Funktionsaufrufen an einen Schüler verschieben/kopieren, wenn der Compiler sie auslässt!?! Ich bin sehr dankbar für g ++ für die Unterstützung einer solchen Option. – Goran

+0

Ich muss es deaktivieren, um die Lebensdauer eines zurückgegebenen Werts zu verstehen, ich kann es jetzt nicht verstehen, weil es das temporäre nicht erstellt, kopiert es einfach direkt. – Zebrafish