今天我一直在看看我在過去幾天一直在努力的一些代碼,並開始閱讀移動語義學,特別是std :: move。我有幾個問題要問你的專業人員,以確保我走的是正確的道路,而不是做出任何愚蠢的假設!這是C++'move'語義的正確用法嗎?
首先:
1)本來,我的代碼有一個返回一大載體功能:
template<class T> class MyObject
{
public:
std::vector<T> doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(theVector);
}; // eo doSomething
}; // eo class MyObject
鑑於 「theVector」 是在這個暫時的, 「用完即棄」,我將功能修改爲:
std::vector<T>&& doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(static_cast<std::vector<T>&&>(theVector));
}; // eo doSomething
這是正確的嗎?這樣做的任何陷阱?
2)我注意到在函數中,我返回std::string
它自動調用移動構造函數。調試返回字符串(謝謝你,阿拉貢),我注意到它稱爲一個明確的移動構造函數。爲什麼有一個字符串類,而不是矢量?
我沒有做任何修改,該功能利用移動語義的:
// below, no need for std::string&& return value?
std::string AnyConverter::toString(const boost::any& _val) const
{
string ret;
// convert here
return(ret); // No need for static_cast<std::string&&> ?
}; // eo toString
3)最後,我想要做一些性能測試,是令人驚訝的快速結果我是因爲std :: move語義,還是我的編譯器(VS2010)做了一些優化?
(省略爲簡潔_getMilliseconds()
實施)
std::vector<int> v;
for(int a(0); a < 1000000; ++a)
v.push_back(a);
std::vector<int> x;
for(int a(0); a < 1000000; ++a)
x.push_back(a);
int s1 = _getMilliseconds();
std::vector<int> v2 = v;
int s2 = _getMilliseconds();
std::vector<int> v3 = std::move(x);
int s3 = _getMilliseconds();
int result1 = s2 - s1;
int result2 = s3 - s2;
的結果,很明顯,真棒。 result1是一項標準任務,耗時630毫秒。第二個結果是0ms。這是對這些東西的很好的性能測試嗎?
我知道這對很多人來說都是顯而易見的,但我想確保在理解我的代碼之前我明白了語義。
在此先感謝!
爲什麼使用'static_cast'而不是'std :: move'? –
GManNickG
2010-11-10 19:49:33
@GMan - 這就是我問這些問題的原因。我的動機最初來自這裏:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm#string無可否認我可能誤讀的動機,因此本文:) – 2010-11-10 19:52:07
如果你真的想學習右值,我已經添加了一個鏈接到我的答案供你閱讀。 – GManNickG 2010-11-10 20:00:30