Copy elision
સી + + કોમ્પ્યુટર પ્રોગ્રામિંગમાં, કોપી એલિઝન એ કમ્પાઇલર ઓપ્ટિમાઇઝેશન તકનીકનો સંદર્ભ આપે છે જે વસ્તુઓની બિનજરૂરી નકલને દૂર કરે છે. સી + + ભાષા ધોરણ સામાન્ય રીતે અમલીકરણને કોઈપણ ઓપ્ટિમાઇઝેશન કરવા માટે પરવાનગી આપે છે, જો પરિણામી પ્રોગ્રામનું અવલોકનક્ષમ વર્તન સમાન હોય, એટલે કે. ઢોંગ કરીને, કાર્યક્રમ ધોરણ દ્વારા ફરજિયાત રીતે અમલમાં મૂકવામાં આવ્યો હતો. તે ઉપરાંત, ધોરણ કેટલીક પરિસ્થિતિઓનું પણ વર્ણન કરે છે જ્યાં નકલને દૂર કરી શકાય છે, પછી ભલે તે પ્રોગ્રામના વર્તનમાં ફેરફાર કરે, સૌથી સામાન્ય વળતર મૂલ્ય ઓપ્ટિમાઇઝેશન છે (નીચે જુઓ). સી + + ધોરણમાં વર્ણવેલ અન્ય વ્યાપક રીતે લાગુ કરાયેલ ઓપ્ટિમાઇઝેશન એ છે કે જ્યારે વર્ગ પ્રકારનાં કામચલાઉ ઓબ્જેક્ટને સમાન પ્રકારનાં ઓબ્જેક્ટમાં નકલ કરવામાં આવે છે. પરિણામે, કોપી-ઇનિશિયલાઇઝેશન સામાન્ય રીતે પ્રદર્શનની દ્રષ્ટિએ ડાયરેક્ટ-ઇનિશિયલાઇઝેશનની સમકક્ષ હોય છે, પરંતુ શબ્દાર્થમાં નહીં; કોપી-ઇનિશિયલાઇઝેશન માટે હજુ પણ સુલભ કોપી કન્સ્ટ્રક્ટરની જરૂર હોય છે. ઓપ્ટિમાઇઝેશન કામચલાઉ ઑબ્જેક્ટ પર લાગુ કરી શકાતું નથી જે સંદર્ભ સાથે બંધાયેલું છે. ઉદાહરણ #include <iost stream> int n = 0; સ્ટ્રક્ટ C {સ્પષ્ટ C (int) {} C (સ્થિરાંક C &) {+ + n;}/કોપી કન્સ્ટ્રક્ટરની દૃશ્યમાન આડઅસર છે};// તે સ્થિર સંગ્રહ અવધિ સાથે ઑબ્જેક્ટને સુધારે છે int મુખ્ય () {C c1 (42);// ડાયરેક્ટ-ઇનિશિયલાઇઝેશન, C ને કૉલ કરે છેઃ: C (પૂર્ણાંક) C c2 = C (42);// કોપી-ઇનિશિયલાઇઝેશન, C ને કૉલ કરે છેઃ: C (સ્થિરાંક C &) std:: cout <<n <std:: એન્ડલ;/પ્રિન્ટ 0 જો કોપી કાઢી નાખવામાં આવી હોય, તો અન્યથા 1] પ્રમાણભૂત a અનુસાર તે પણ અસ્પષ્ટ છે કે શું આ ઓપ્ટિમાઇઝેશન માત્ર કામચલાઉ વસ્તુઓ પર જ લાગુ પડે છે, અથવા નામવાળી વસ્તુઓ પર પણ લાગુ થાય છે. નીચે આપેલા સ્રોત કોડને જોતાંઃ #include <iost stream> સ્ટ્રક્ટ C {C () = મૂળભૂત; C (સ્થિરાંક C &) {std:: cout <<"હેલો વર્લ્ડ! \n";}; રદબાતલ f () {C c; ફેંક c;// નામવાળી વસ્તુ c ને અપવાદ પદાર્થમાં નકલ કરવી. //તે અસ્પષ્ટ છે કે શું આ નકલ કાઢી શકાય છે (અવગણવામાં આવી છે). પૂર્ણાંક મુખ્ય () {અજમાવો {f ();} કેચ (C c) {///અપવાદ ઘોષણામાં અસ્થાયીમાં અપવાદ પદાર્થની નકલ કરી રહ્યું છે. //તે પણ અસ્પષ્ટ છે કે શું આ નકલ કાઢી નાખવામાં આવી શકે છે (અવગણવામાં આવી છે). તેથી અનુરૂપ કમ્પાઇલરે એક પ્રોગ્રામ બનાવવો જોઈએ જે "હેલો વર્લ્ડ!" પ્રિન્ટ કરે છે. બે વાર. સી + + ધોરણ (સી + + 11) ના વર્તમાન પુનરાવર્તનમાં, મુદ્દાઓને સંબોધવામાં આવ્યા છે, જેમાં અનિવાર્યપણે નામવાળી વસ્તુમાંથી અપવાદ વસ્તુની નકલ અને અપવાદ હેન્ડલરમાં જાહેર કરાયેલ વસ્તુની નકલ બંનેને મંજૂરી આપવામાં આવી છે. જી. સી. સી. કોપી-એલિઝનને નિષ્ક્રિય કરવા માટે-fno-elide-containers વિકલ્પ પ્રદાન કરે છે. આ વિકલ્પ વળતર મૂલ્ય ઓપ્ટિમાઇઝેશન અથવા અન્ય ઓપ્ટિમાઇઝેશનની અસરોને અવલોકન કરવા (અથવા અવલોકન ન કરવા) માટે ઉપયોગી છે જ્યાં નકલો દૂર કરવામાં આવે છે. સામાન્ય રીતે આ મહત્વપૂર્ણ ઓપ્ટિમાઇઝેશનને નિષ્ક્રિય કરવાની ભલામણ કરવામાં આવતી નથી. રીટર્ન વેલ્યુ ઓપ્ટિમાઇઝેશન સી + + પ્રોગ્રામિંગ લેંગ્વેજના સંદર્ભમાં, રીટર્ન વેલ્યુ ઓપ્ટિમાઇઝેશન (આરવીઓ) એ કમ્પાઇલર ઓપ્ટિમાઇઝેશન છે જેમાં ફંક્શનના રીટર્ન વેલ્યુને પકડી રાખવા માટે બનાવેલ કામચલાઉ ઓબ્જેક્ટને દૂર કરવાનો સમાવેશ થાય છે. આર. વી. ઓ. ને સી + + ધોરણ દ્વારા પરિણામી કાર્યક્રમની અવલોકનક્ષમ વર્તણૂકને બદલવાની મંજૂરી છે. સારાંશ સામાન્ય રીતે, સી + + ધોરણ કમ્પાઇલરને કોઈપણ ઓપ્ટિમાઇઝેશન કરવાની મંજૂરી આપે છે, જો કે પરિણામી એક્ઝેક્યુટેબલ સમાન અવલોકનક્ષમ વર્તન દર્શાવે છે (એટલે કે. ઢોંગ) ધોરણની તમામ જરૂરિયાતો પૂર્ણ થઈ છે. આને સામાન્ય રીતે "જેમ-જો નિયમ" તરીકે ઓળખવામાં આવે છે. વળતર મૂલ્ય ઓપ્ટિમાઇઝેશન શબ્દ સી + + ધોરણમાં એક વિશેષ કલમનો ઉલ્લેખ કરે છે જે "જો હોય તો" નિયમ કરતાં પણ વધુ આગળ જાય છેઃ અમલીકરણ વળતર નિવેદનના પરિણામે નકલ કામગીરીને છોડી શકે છે, પછી ભલે નકલ કન્સ્ટ્રક્ટરની આડઅસરો હોય. નીચેનું ઉદાહરણ એક દૃશ્ય દર્શાવે છે જ્યાં અમલીકરણ એક અથવા બંને નકલોને દૂર કરી શકે છે, પછી ભલે કોપી કન્સ્ટ્રક્ટરની દૃશ્યમાન આડઅસર (પ્રિન્ટિંગ ટેક્સ્ટ) હોય. પ્રથમ નકલ કે જેને દૂર કરી શકાય છે તે તે છે જ્યાં નામહીન કામચલાઉ C ને ફંક્શન f ના વળતર મૂલ્યમાં નકલ કરી શકાય છે. બીજી નકલ કે જે દૂર કરી શકાય છે તે એફ દ્વારા ઓબીજેને પરત કરવામાં આવેલી કામચલાઉ વસ્તુની નકલ છે. #include <iostોટ્રીમ> સ્ટ્રક્ટ C {C () = મૂળભૂત; C (કોન્સ્ટ C &) {std:: cout <<"એક નકલ બનાવવામાં આવી હતી. \n";}}; C f () {રીટર્ન C ();} int મેઇન () {std:: cout <<<"હેલો વર્લ્ડ! \n"; C obj = f ();} કમ્પાઇલર અને તે કમ્પાઇલરની સેટિંગ્સ પર આધાર રાખીને, પરિણામી પ્રોગ્રામ નીચેનામાંથી કોઈપણ આઉટપુટ પ્રદર્શિત કરી શકે છેઃ હેલો વર્લ્ડ! એક નકલ બનાવવામાં આવી હતી. એક નકલ બનાવવામાં આવી હતી. હેલો વર્લ્ડ! એક નકલ બનાવવામાં આવી હતી. હેલો વર્લ્ડ! કાર્યમાંથી બિલ્ટ-ઇન પ્રકારની ઑબ્જેક્ટ પરત કરવાની પૃષ્ઠભૂમિ સામાન્ય રીતે બહુ ઓછી અથવા કોઈ ઓવરહેડ વહન કરતી નથી, કારણ કે ઑબ્જેક્ટ સામાન્ય રીતે CPU રજિસ્ટરમાં બંધબેસે છે. વર્ગ પ્રકારનાં મોટા ઓબ્જેક્ટને પરત કરવા માટે એક મેમરી સ્થાનથી બીજામાં વધુ ખર્ચાળ નકલની જરૂર પડી શકે છે. આને ટાળવા માટે, અમલીકરણ કોલ કરનારની સ્ટૅક ફ્રેમમાં છુપાયેલ ઑબ્જેક્ટ બનાવી શકે છે, અને આ ઓબ્જેક્ટનું સરનામું ફંક્શનમાં પસાર કરી શકે છે. કાર્યનું વળતર મૂલ્ય પછી છુપાયેલા પદાર્થમાં નકલ કરવામાં આવે છે. આમ, આ પ્રકારનો કોડઃ સ્ટ્રક્ટ ડેટા {ચાર બાઇટ્સ [16];}; ડેટા એફ () {ડેટા પરિણામ = {};// પરિણામ વળતર પરિણામ જનરેટ કરે છે;} ઇન્ટ મેઇન () {ડેટા ડી = એફ ();} આની સમકક્ષ કોડ જનરેટ કરી શકે છેઃ સ્ટ્રક્ટ ડેટા {ચાર બાઇટ્સ [16];}; ડેટા * એફ (ડેટા * _ હિડન એડ્રેસ) {ડેટા પરિણામ = {};// પરિણામને હિડન ઓબ્જેક્ટમાં કોપી કરો * _ હિડન એડ્રેસ = પરિણામ; રીટન _ હિડન એડ્રેસ;} ઇન્ટ મેઇન () {ડેટા _ હિડન;// હિડન ઓબ્જેક્ટ ડેટા ડી = * એફ (& _ હિડન) બનાવો;// પરિણામને ડીમાં કોપી કરો જે ડેટા ઓબ્જેક્ટને બે વાર કોપી કરવાનું કારણ બને છે. સી + + ની ઉત્ક્રાંતિના પ્રારંભિક તબક્કામાં, કાર્યમાંથી વર્ગ પ્રકારનાં પદાર્થને અસરકારક રીતે પરત કરવામાં ભાષાની અસમર્થતાને નબળાઈ માનવામાં આવતી હતી. 1991 ની આસપાસ, વોલ્ટર બ્રાઇટે નકલને ઓછી કરવા માટે એક તકનીકનો અમલ કર્યો, પરિણામને પકડી રાખવા માટે ઉપયોગમાં લેવાતા પદાર્થ સાથે કાર્યની અંદર છુપાયેલા પદાર્થ અને નામના પદાર્થને અસરકારક રીતે બદલી નાખ્યુંઃ સ્ટ્રક્ટ ડેટા {ચાર બાઇટ્સ [16];}; રદબાતલ F (ડેટા * p) {// સીધા જ * p} ઇન્ટ મેઇન () {ડેટા d; F (& d);} માં પરિણામ જનરેટ કરે છે. આ ચોક્કસ તકનીકને પાછળથી "નેમ્ડ રીટર્ન વેલ્યુ ઓપ્ટિમાઇઝેશન" (NRVO) નામ આપવામાં આવ્યું હતું, જે એ હકીકતનો ઉલ્લેખ કરે છે કે નામના પદાર્થની નકલ દૂર કરવામાં આવે છે. કમ્પાઇલર સપોર્ટ રિટર્ન વેલ્યુ ઓપ્ટિમાઇઝેશન મોટાભાગના કમ્પાઇલર્સ પર સપોર્ટેડ છે. જો કે, એવા સંજોગો હોઈ શકે છે કે જ્યાં કમ્પાઇલર ઓપ્ટિમાઇઝેશન કરવામાં અસમર્થ હોય. એક સામાન્ય કિસ્સો એ છે કે જ્યારે ફંક્શન એક્ઝેક્યુશનના પાથના આધારે અલગ-અલગ નામવાળી ઓબ્જેક્ટો પરત કરી શકે છેઃ #include <શબ્દમાળા> std:: શબ્દમાળા F (બૂલ કોન્ડ = ખોટી) {std:: શબ્દમાળા પ્રથમ ("પ્રથમ"); std:: શબ્દમાળા બીજી ("બીજી");// કાર્ય તેની દલીલના આધારે બે નામવાળી ઓબ્જેક્ટોમાંથી એક પરત કરી શકે છે. આર. વી. ઓ. ને વળતર માટે લાગુ કરવામાં નહીં આવે? પહેલુંઃ બીજું;} પૂર્ણાંક મુખ્ય () {std:: શબ્દમાળા પરિણામ = F ();} બાહ્ય કડીઓ cppreference.com સંદર્ભો પર કોપી એલિઝન ઉદાહરણ તરીકે C + + કોડ કમ્પાઇલર ઓપ્ટિમાઇઝેશન C + + સાથે લેખો