का रिटर्न वैल्यू ऑप्टिमाइज़ेशन मैं टुपल/संबंधों के मामले में रिटर्न वैल्यू ऑप्टिमाइज़ेशन में देख रहा हूं और जिस व्यवहार का मैं पालन करता हूं वह उतना ही नहीं है जितना मैं उम्मीद करता हूं। नीचे दिए गए उदाहरण में मैं उम्मीद करता हूं कि चलने वाले अर्थशास्त्र को लात मारने की उम्मीद है, जो यह करता है, लेकिन एक प्रतिलिपि है जो बनी हुई है। अनुकूलित में नीचे से उत्पादन होता है:टुपल/टाई
Test duo output, non_reference tuple
Default constructor invoked
Parameter constructor invoked
Copy constructor invoked
Move Assignment operator invoked
100
समारोह अंदर टपल बनाने में प्रति निर्माता के आह्वान के अनावश्यक लगता है। क्या इसे हटाने का कोई तरीका है? मैं एमएसवीसी 2012 कंपाइलर का उपयोग कर रहा हूँ।
#include <iostream>
#include <tuple>
class A
{
public:
int value;
A() : value(-1)
{
std::cout << "Default constructor invoked" << std::endl;
}
explicit A(const int v) : value(v)
{
std::cout << "Parameter constructor invoked" << std::endl;
}
A(const A& rhs)
{
value = rhs.value;
std::cout << "Copy constructor invoked" << std::endl;
}
A(const A&& rhs)
{
value = rhs.value;
std::cout << "Move constructor invoked" << std::endl;
}
A& operator=(const A& rhs)
{
value = rhs.value;
std::cout << "Assignment operator invoked" << std::endl;
return *this;
}
A& operator=(const A&& rhs)
{
value = rhs.value;
std::cout << "Move Assignment operator invoked" << std::endl;
return *this;
}
};
std::tuple<A, int> return_two_non_reference_tuple()
{
A tmp(100);
return std::make_tuple(tmp, 99);
}
int main(int argc, char* argv[])
{
std::cout << "Test duo output, non_reference tuple" << std::endl;
A t3;
int v1;
std::tie(t3, v1) = return_two_non_reference_tuple();
std::cout << t3.value << std::endl << std::endl;
system("pause");
return 0;
}
धन्यवाद, यह साधारण मामले के लिए एक अच्छा विकल्प है, लेकिन यदि टीएमपी पर और अधिक क्रियाएं होती हैं, और अधिक आउटपुट, तो यह काम नहीं करेगा। और मुझे नहीं लगता कि यह एमएसवीसी 2012 में काम करेगा। – thorsan
कॉपी एलिजन यहां हो रहा है। समस्या यह है कि 'tmp' को 'tuple' में नहीं ले जाया जा रहा है। कॉपी कन्स्ट्रक्टर 'tmp' को tuple में कॉपी करने से है, न कि कॉपी की प्रतिलिपि बनाई जा रही है। – Simple
@ सिंपल मुझे पता है कि, शायद मेरा जवाब पर्याप्त स्पष्ट नहीं है। – TartanLlama