आज रात मैं कुछ कोड देख रहा हूं जो मैं पिछले कुछ दिनों में काम कर रहा हूं, और विशेष रूप से std :: 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
है जो इसे स्वचालित रूप से चालक कन्स्ट्रक्टर कहलाता है। स्ट्रिंग की वापसी (धन्यवाद, Aragorn) में डिबगिंग, मैंने देखा कि इसे एक स्पष्ट चाल कन्स्ट्रक्टर कहा जाता है। स्ट्रिंग क्लास के लिए एक और वेक्टर क्यों नहीं है?
मैं इस कदम अर्थ विज्ञान का लाभ लेने के लिए इस समारोह के लिए कोई संशोधन करना नहीं था:
// 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 semantics के कारण मिला है या मेरे कंपाइलर (वीएस -2010) ने कुछ अनुकूलन भी किया है?
(_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;
परिणाम थे, जाहिर है, भयानक। परिणाम 1, एक मानक असाइनमेंट, 630ms लिया। दूसरा परिणाम, 0ms था। क्या यह इन चीजों का अच्छा प्रदर्शन परीक्षण है?
मुझे पता है कि इनमें से कुछ आप के लिए स्पष्ट हैं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं अपने कोड पर ब्लेज़र जाने से ठीक पहले अर्थशास्त्र को समझूं।
अग्रिम धन्यवाद!
आप 'std :: move' के बजाय' static_cast 'का उपयोग क्यों कर रहे हैं? –
GManNickG
@GMan - यही कारण है कि मैं इन प्रश्नों से पूछ रहा हूं। मेरी प्रेरणा मूल रूप से यहां से आई थी: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm#string प्रेरणा जो मैंने स्वीकार किया है कि मैंने गलत पढ़ा होगा, इसलिए यह पोस्ट :) –
यदि आप वास्तव में राजस्व सीखना चाहते हैं तो मैंने आपके जवाब के लिए एक लिंक जोड़ा है। – GManNickG