複製elision方法的標準定義: 在C++計算機編程中,複製elision是指消除不必要的對象複製的編譯器優化技術。 讓我們考慮下面的代碼複製elision方法
#include <cstdlib>
#include <iostream>
using namespace std;
int n=0;
struct C
{
C (int) {}
C(const C&) {++n;}
};
int main(int argc, char *argv[])
{
C c1(42);
C c2=42;
return n;
}
這條線「返回N」將返回0或1,這取決於複製是否被省略。
也考慮這個代碼
#include <iostream>
struct C {
C() {}
C(const C&) { std::cout << "Hello World!\n"; }
};
void f() {
C c;
throw c; // copying the named object c into the exception object.
} // It is unclear whether this copy may be elided.
int main() {
try {
f();
}
catch(C c) {
}
}
它說, //複製異常對象到臨時在異常聲明。 //此副本是否可能被取消也不清楚。 所以我的問題是實現這種優化方法有多麼有用,如果有時結果是不確定的?一般來說它的使用頻率如何?
在第一個例子中甚至沒有副本。對於第二個示例:http://stackoverflow.com/q/7401521/46642 –
@ R.MartinhoFernandes:在這個問題的第二個例子(而不是你的鏈接問題)中,與NRVO發生的警告相同:從'如果編譯器可以保證在構造對象'c'時拋出異常,那麼只有在異常的內部存儲器才能被刪除。即使在那裏,根據我的理解,用戶所具有的問題是標準沒有強制規定這種行爲,這意味着您不能依賴複製構造函數的副作用 - 這是標準明確指出的 –