घोषित करने की आवश्यकता है मैंने पाया है कि इंटेल कंपाइलर std :: array ऑब्जेक्ट्स के लिए रिटर्न वैल्यू ऑप्टिमाइज़ेशन उत्पन्न नहीं करता है। निम्न कोड, जो मेरे प्रोग्राम के आंतरिक लूप में होता है, अनुकूलित नहीं किया जा सकता है।क्या रिटर्न वैल्यू ऑप्टिमाइज़ेशन को कॉपी कॉपी कन्स्ट्रक्टर
std::array<double, 45> f(const std::array<double, 45>& y) {
auto dy_dt = std::array<double, 45>();
...
return dy_dt;
}
मैं पता लगा है कि इस व्यवहार तथ्य यह है कि मेरी मानक पुस्तकालय कार्यान्वयन स्पष्ट रूप से std :: सरणी के लिए एक प्रतिलिपि निर्माता को परिभाषित नहीं करता से आता है। निम्नलिखित कोड को दर्शाता है कि:
class Test {
public:
Test() = default;
Test(const Test& x);
};
Test f() {
auto x = Test();
return x;
}
जब आप इसके साथ
icpc -c -std=c++11 -qopt-report=2 test.cpp -o test.o
रिपोर्ट फाइल से पता चलता
INLINE REPORT: (f(Test *)) [1] main.cpp(7,10)
जो साबित करता है कि संकलक उत्पन्न करता RVO संकलन (च के हस्ताक्षर बदल गया है इसलिए यह कॉलिंग साइट के ढेर पर नव निर्मित ऑब्जेक्ट डाल सकता है)। लेकिन आप लाइन है कि Test(const Test& x);
वाणी बाहर टिप्पणी करता है, तो, रिपोर्ट फ़ाइल
INLINE REPORT: (f()) [1] main.cpp(7,10)
जो साबित करता है कि RVO उत्पन्न नहीं कर रहा है पता चलता है।
आरवीओ को परिभाषित करने वाले सी ++ 11 मानक के 12.8.31 में, उनके द्वारा दिए गए उदाहरण में एक प्रतिलिपि है। तो, क्या यह इंटेल कंपाइलर का एक "बग" है या मानक के अनुरूप कार्यान्वयन है?
@ साइबर नंबर, यदि आरवीओ संभव था तो यह प्रतिलिपि को पूरा करेगा। – juanchopanza
साइबर: नहीं, इसे यहां वापस मूल्य मूल्य अनुकूलन नाम दिया गया है। इसके चलते अर्थशास्त्र के साथ कुछ लेना देना नहीं है। – InsideLoop
आरवीओ को एक प्रतिलिपि प्रतिलिपि की आवश्यकता नहीं है, लेकिन जिस कोड के लिए आरवीओ लागू होगा, वह वैध प्रतिलिपि या कन्स्ट्रक्टर को उपलब्ध होने की आवश्यकता है। – juanchopanza