मुझे पता नहीं लगा सकता है कि निम्न कोड में std :: move कुछ भी अच्छा करता है या यह पूरी तरह से गलत है? कक्षा Object
दोनों मूव और कॉपी कन्स्ट्रक्टर परिभाषित है।क्या std :: move effeciency के लिए रिटर्न-स्टेटमेंट में उपयोग किया जाना चाहिए?
पहले:
template<typename T> template <typename F>
const Object<T> Object<T>::operator*(const F& rhs) const
{
return std::move(Object(*this) *= rhs); // We end in move constructor
}
दूसरा:: ले जाएँ के बिना: चाल के साथ
template<typename T> template <typename F>
const Object<T> Object<T>::operator*(const F& rhs) const
{
return Object(*this) *= rhs; // We end in copy constructor
}
*=
ऑपरेटर के रूप में परिभाषित किया गया है:
template<typename T> template<typename F>
Object<T>& Object<T>::operator*=(const F& rhs)
{
for(int i = 0; i < dimension ; i++)
{
_inner[i] *= rhs;
}
return *this;
}
यहाँ सह है डी मैं इसे परीक्षण करने के लिए उपयोग करें:
Object<double> test(4);
Object<double> test2(test * 4);
std::cout << test2; // works fine
परिणाम पहले मामले हम इस कदम निर्माता में अंत में और दूसरा में हम प्रति निर्माता में खत्म हो।
किसी भी मामले में कोड संकलित करता है।
एक दूसरे से अधिक कुशल है क्योंकि मुझे लगता है कि इसे कॉपी करने के बजाय नई ऑब्जेक्ट को स्थानांतरित करना तेज़ है?
अतिरिक्त जानकारी: मैं निम्नलिखित संकलक का उपयोग करें: जी ++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
'const' मान वापस न करें, स्पष्ट रूप से' std :: move' स्थानीय चर/अस्थायी नहीं है, यह रोकता है (एन) आरवीओ। अपने 'ऑपरेटर *' को 'ऑब्जेक्ट tmp (* यह) के रूप में क्यों न लिखें; टीएमपी * = आरएएस; वापसी टीएमपी; '? इस तरह, कंपाइलर्स देखता है कि आप एक स्थानीय चर लौटाते हैं और इसे वापस लौटने पर स्वचालित रूप से इसे एक रावल्यू में बदल देते हैं। – Xeo
यहां एक नज़र डालें: http://stackoverflow.com/questions/4986673/c11-rvalues-and-move-semantics-confusion – Steve
मैंने अभी तक 'कॉन्स्ट' के बिना परीक्षण किया है, यह स्थिति को नहीं बदलेगा, लेकिन मैं समझ सकता हूं उत्तर से मुझे 'std :: move' की आवश्यकता है क्योंकि मैं' lvalue' लौटाता हूं। अगर दूसरी ओर यह 'rvalue' था और मुझे 'std :: move' की आवश्यकता नहीं थी। और आखिरकार अगर मैंने एक अस्थायी चर का उपयोग किया तो यह स्वचालित रूप से बाहर हो जाएगा? – CodeTower