एक समारोह फोन करने वाले के लिए दो मानों वापस जाने के लिए की जरूरत है। कार्यान्वित करने का सबसे अच्छा तरीका क्या है?RVO होगा जब std :: जोड़ी लौटने?
विकल्प 1:
pair<U,V> myfunc()
{
...
return make_pair(getU(),getV());
}
pair<U,V> mypair = myfunc();
विकल्प 1.1:
// Same defn
U u; V v;
tie(u,v) = myfunc();
विकल्प 2:
void myfunc(U& u , V& v)
{
u = getU(); v= getV();
}
U u; V v;
myfunc(u,v);
मैं Option2 साथ पता है, वहाँ कोई प्रतियां/चाल हैं, लेकिन यह बदसूरत लग रहा है। विकल्प 1, 1.1 में कोई प्रतियां/चालें होंगी? आइए मान लें कि यू और वी दोनों बड़ी प्रतिलिपि हैं जो प्रतिलिपि/चालन संचालन का समर्थन करते हैं।
प्रश्न: यह सैद्धांतिक रूप से मानक के अनुसार किसी भी RVO/NRVO अनुकूलन के लिए संभव है? यदि हां, तो क्या जीसीसी या कोई अन्य कंपाइलर अभी तक कार्यान्वित है?
मुझे 'std :: pair' के बारे में कुछ भी पता नहीं है जो आरवीओ/एनआरवीओ को रोक देगा। एक कॉपी कन्स्ट्रक्टर सहित परीक्षण करना आम तौर पर आसान होता है जो आपको बताता है कि एक प्रति कब होती है। –
जी ++ RVO कि जोड़ी को कॉपी रोकता है, को लागू करता है लेकिन आप अभी भी यू की प्रति और वी जोड़ी में है। –
मैं कुछ परीक्षण भाग गया, और मैंने पाया कि जी ++, जो एक तेज थी के साथ एक बहुत क्या पर इनलाइनिंग संभव हो गया था और यू और वी के लिए प्रति कंस्ट्रक्टर्स तुम सिर्फ प्रदर्शन के लिए देख रहे हैं की जटिलता निर्भर, मुझे लगता है तुम हूँ यह निर्धारित करने के लिए प्रोफाइल करना होगा कि सबसे तेज़ कौन सा है। –