हाल ही में, मैं this post और that post पढ़ रहा हूं जो रिस्टिंग कॉस्ट ऑब्जेक्ट्स को रोकने के लिए सुझाव दे रहा है। यह सुझाव भी जा रहे हैं में his talk में स्टीफ़न टी Lavavej द्वारा दिया जाता है मूल निवासी 2013एक कॉन्स्टर्ड ऑब्जेक्ट को कैसे स्थानांतरित कर रहा है?
मैं एक बहुत ही साधारण परीक्षण लिखा था मुझे समझने जो निर्माता/ऑपरेटर उन सभी मामलों में कहा जाता है मदद करने के लिए:
- रिटर्निंग कॉन्स या गैर कॉन्स ऑब्जेक्ट्स
- क्या होगा यदि रिटर्न वैल्यू ऑप्टिमाइज़ेशन (RVO) में शामिल है?
- क्या होगा यदि नामांकित रिटर्न वैल्यू ऑप्टिमाइज़ेशन (एनआरवीओ) में शामिल हो जाए?
यहाँ परीक्षा है:
#include <iostream>
void println(const std::string&s){
try{std::cout<<s<<std::endl;}
catch(...){}}
class A{
public:
int m;
A():m(0){println(" Default Constructor");}
A(const A&a):m(a.m){println(" Copy Constructor");}
A(A&&a):m(a.m){println(" Move Constructor");}
const A&operator=(const A&a){m=a.m;println(" Copy Operator");return*this;}
const A&operator=(A&&a){m=a.m;println(" Move Operator");return*this;}
~A(){println(" Destructor");}
};
A nrvo(){
A nrvo;
nrvo.m=17;
return nrvo;}
const A cnrvo(){
A nrvo;
nrvo.m=17;
return nrvo;}
A rvo(){
return A();}
const A crvo(){
return A();}
A sum(const A&l,const A&r){
if(l.m==0){return r;}
if(r.m==0){return l;}
A sum;
sum.m=l.m+r.m;
return sum;}
const A csum(const A&l,const A&r){
if(l.m==0){return r;}
if(r.m==0){return l;}
A sum;
sum.m=l.m+r.m;
return sum;}
int main(){
println("build a");A a;a.m=12;
println("build b");A b;b.m=5;
println("Constructor nrvo");A anrvo=nrvo();
println("Constructor cnrvo");A acnrvo=cnrvo();
println("Constructor rvo");A arvo=rvo();
println("Constructor crvo");A acrvo=crvo();
println("Constructor sum");A asum=sum(a,b);
println("Constructor csum");A acsum=csum(a,b);
println("Affectation nrvo");a=nrvo();
println("Affectation cnrvo");a=cnrvo();
println("Affectation rvo");a=rvo();
println("Affectation crvo");a=crvo();
println("Affectation sum");a=sum(a,b);
println("Affectation csum");a=csum(a,b);
println("Done");
return 0;
}
और यहाँ (NRVO और RVO के साथ) को रिलीज़ मोड में उत्पादन होता है: :
build a
Default Constructor
build b
Default Constructor
Constructor nrvo
Default Constructor
Constructor cnrvo
Default Constructor
Constructor rvo
Default Constructor
Constructor crvo
Default Constructor
Constructor sum
Default Constructor
Move Constructor
Destructor
Constructor csum
Default Constructor
Move Constructor
Destructor
Affectation nrvo
Default Constructor
Move Operator
Destructor
Affectation cnrvo
Default Constructor
Copy Operator
Destructor
Affectation rvo
Default Constructor
Move Operator
Destructor
Affectation crvo
Default Constructor
Copy Operator
Destructor
Affectation sum
Copy Constructor
Move Operator
Destructor
Affectation csum
Default Constructor
Move Constructor
Destructor
Copy Operator
Destructor
Done
Destructor
Destructor
Destructor
Destructor
Destructor
Destructor
Destructor
Destructor
क्या मैं understant नहीं है यह है "कन्स्ट्रक्टर सीएसयूएम" परीक्षण में चलने वाले चालक का उपयोग क्यों किया जाता है?
रिटर्न ऑब्जेक्ट कॉन्स है इसलिए मुझे वास्तव में लगता है कि इसे कॉपी कन्स्ट्रक्टर को कॉल करना चाहिए।
मुझे यहां क्या याद आ रही है?
यह संकलक से एक बग नहीं होना चाहिए, दोनों दृश्य स्टूडियो और क्लैंग एक ही आउटपुट देते हैं।
uint4 क्या है? यह इसके कारण यहां संकलित नहीं होता है, जो मुझे आश्चर्यचकित करता है कि यदि आप यहां मौजूद कोड को संकलित और निष्पादित करते हैं ... – PlasmaHH
क्षमा करें यह सिर्फ एक int है। मैंने सवाल संशोधित किया। – Arnaud
एकाधिक रिटर्न विकल्पों के द्वारा एनआरओओ को ब्लॉक करता है जो समान चर नहीं हैं। – Yakk