Copy elision
سی + + کمپیوٹر پروگرامنگ میں، کاپی ایلیژن سے مراد ایک مرتب کرنے والی اصلاح کی تکنیک ہے جو اشیاء کی غیر ضروری کاپی کو ختم کرتی ہے۔ سی + + زبان کا معیار عام طور پر نفاذ کو کسی بھی اصلاح کو انجام دینے کی اجازت دیتا ہے، بشرطیکہ نتیجے میں آنے والے پروگرام کا قابل مشاہدہ طرز عمل ایک جیسا ہو، یعنی۔ دکھاوا کرتے ہوئے، پروگرام کو بالکل اسی طرح انجام دیا گیا جس طرح معیار کے ذریعہ حکم دیا گیا تھا۔ اس کے علاوہ، معیار کچھ ایسے حالات کو بھی بیان کرتا ہے جہاں کاپی کو ختم کیا جا سکتا ہے یہاں تک کہ اگر اس سے پروگرام کا طرز عمل بدل جائے، سب سے عام واپسی کی قیمت کی اصلاح ہے (نیچے دیکھیں)۔ ایک اور وسیع پیمانے پر نافذ کردہ اصلاح، جو C + + معیار میں بیان کی گئی ہے، وہ ہے جب کلاس کی قسم کے عارضی آبجیکٹ کو اسی قسم کے آبجیکٹ میں کاپی کیا جاتا ہے۔ نتیجے کے طور پر، کاپی-انیشیئلائزیشن عام طور پر کارکردگی کے لحاظ سے براہ راست-انیشیئلائزیشن کے مساوی ہوتی ہے، لیکن سیمنٹکس میں نہیں ؛ کاپی-انیشیئلائزیشن کے لیے اب بھی قابل رسائی کاپی کنسٹرکٹر کی ضرورت ہوتی ہے۔ اصلاح کا اطلاق کسی عارضی شے پر نہیں کیا جا سکتا جو کسی حوالہ سے منسلک ہو۔ مثال #include <iost stream> int n = 0 ؛ ساخت C {واضح C (int) {} C (کانسٹ C &) {+ + n;}/کاپی کنسٹرکٹر کا ایک نظر آنے والا ضمنی اثر ہے} ؛// یہ جامد اسٹوریج کے دورانیے کے ساتھ کسی شے میں ترمیم کرتا ہے int مین () {C c1 (42) ؛// ڈائریکٹ-انیشیئلائزیشن، C کو کال کرتا ہے:: C (int) C c2 = C (42) ؛// کاپی-انیشیئلائزیشن، C کو کال کرتا ہے:: C (کانسٹ C &) std:: cout <<n <std::// پرنٹ 0 اگر کاپی ایلیڈ تھی، بصورت دیگر 1] معیاری a کے مطابق یہ بھی واضح نہیں ہے کہ آیا یہ اصلاح صرف عارضی اشیاء پر لاگو ہوتی ہے، یا نامزد اشیاء پر بھی لاگو ہوتی ہے۔ مندرجہ ذیل سورس کوڈ کو دیکھتے ہوئے: #include <iostोटریم> اسٹرک C {C () = ڈیفالٹ ؛ C (کانسٹ C &) {std:: cout <<"ہیلو ورلڈ! \n";}} ؛ کالعدم f () {C c ؛ پھینک c ؛// نامزد آبجیکٹ c کو ایکسپشن آبجیکٹ میں کاپی کرنا۔ //یہ واضح نہیں ہے کہ آیا اس کاپی کو خارج کیا جا سکتا ہے (خارج کر دیا گیا ہے)۔ انٹ مین () {آزمائیں {f () ؛} کیچ (C c) {// رعایت کے اعلامیے میں عارضی طور پر استثنی کے آبجیکٹ کی کاپی کرنا۔ //یہ بھی واضح نہیں ہے کہ آیا اس کاپی کو خارج کیا جا سکتا ہے (خارج کر دیا گیا ہے)۔ اس لیے ایک مطابقت پذیر مرتب کرنے والے کو ایک ایسا پروگرام تیار کرنا چاہیے جو "ہیلو ورلڈ!" پرنٹ کرے۔ دو بار۔ سی + + معیار (سی + + 11) کی موجودہ نظر ثانی میں، مسائل کو حل کیا گیا ہے، جس سے بنیادی طور پر نامزد آبجیکٹ کی کاپی سے استثنی آبجیکٹ، اور استثنی ہینڈلر میں اعلان کردہ آبجیکٹ کی کاپی دونوں کو خارج کرنے کی اجازت دی گئی ہے۔ جی سی سی کاپی-ایلیژن کو غیر فعال کرنے کے لیے-fno-elide-containers آپشن فراہم کرتا ہے۔ یہ آپشن ریٹرن ویلیو آپٹیمائزیشن یا دیگر آپٹیمائزیشنز کے اثرات کا مشاہدہ کرنے (یا مشاہدہ نہ کرنے) کے لیے مفید ہے جہاں کاپیاں ختم ہو جاتی ہیں۔ عام طور پر اس اہم اصلاح کو غیر فعال کرنے کی سفارش نہیں کی جاتی ہے۔ ریٹرن ویلیو آپٹیمائزیشن سی + + پروگرامنگ زبان کے تناظر میں، ریٹرن ویلیو آپٹیمائزیشن (آر وی او) ایک مرتب کرنے والا آپٹیمائزیشن ہے جس میں فنکشن کی ریٹرن ویلیو کو برقرار رکھنے کے لیے بنائی گئی عارضی شے کو ختم کرنا شامل ہے۔ آر وی او کو سی + + معیار کے ذریعہ نتیجے میں آنے والے پروگرام کے قابل مشاہدہ رویے کو تبدیل کرنے کی اجازت ہے۔ خلاصہ عام طور پر، سی + + معیار ایک مرتب کو کسی بھی اصلاح کو انجام دینے کی اجازت دیتا ہے، بشرطیکہ نتیجے میں قابل عمل وہی قابل مشاہدہ طرز عمل ظاہر کرے جیسے کہ (یعنی۔ دکھاوا کرتے ہوئے) معیار کی تمام ضروریات پوری ہو چکی ہیں۔ اسے عام طور پر "اس-آئی ایف رول" کہا جاتا ہے۔ ریٹرن ویلیو آپٹیمائزیشن کی اصطلاح سی + + معیار میں ایک خاص شق سے مراد ہے جو "جیسا کہ" اصول سے بھی آگے جاتا ہے: ایک نفاذ ریٹرن سٹیٹمنٹ کے نتیجے میں کاپی آپریشن کو چھوڑ سکتا ہے، چاہے کاپی کنسٹرکٹر کے مضر اثرات ہی کیوں نہ ہوں۔ مندرجہ ذیل مثال ایک ایسے منظر نامے کو ظاہر کرتی ہے جہاں عمل درآمد سے ایک یا دونوں کاپیاں ختم ہو سکتی ہیں، چاہے کاپی کنسٹرکٹر کا نظر آنے والا ضمنی اثر (پرنٹنگ ٹیکسٹ) ہی کیوں نہ ہو۔ پہلی کاپی جسے ہٹا دیا جا سکتا ہے وہ ہے جہاں ایک بے نام عارضی C کو فنکشن f کی ریٹرن ویلیو میں کاپی کیا جا سکتا ہے۔ دوسری کاپی جسے ہٹا دیا جا سکتا ہے وہ عارضی آبجیکٹ کی کاپی ہے جو f کے ذریعے obj کو واپس کی گئی ہے۔ #include <iostोटریم> اسٹرک C {C () = ڈیفالٹ ؛ C (کانسٹ C &) {std:: cout <<"ایک کاپی بنائی گئی تھی۔ \n" ؛}} ؛ C f () {واپسی C () ؛} int main () {std:: cout <<"ہیلو ورلڈ! \n" ؛ C obj = f () ؛} مرتب کنندہ، اور اس مرتب کنندہ کی ترتیبات پر منحصر ہے، نتیجے میں پروگرام مندرجہ ذیل میں سے کوئی بھی آؤٹ پٹ ظاہر کر سکتا ہے: ہیلو ورلڈ! ایک کاپی بنائی گئی۔ ایک کاپی بنائی گئی۔ ہیلو ورلڈ! ایک کاپی بنائی گئی۔ ہیلو ورلڈ! کسی فنکشن سے بلٹ ان قسم کے آبجیکٹ کو واپس کرنے کا پس منظر عام طور پر بہت کم یا کوئی اوور ہیڈ نہیں رکھتا ہے، کیونکہ آبجیکٹ عام طور پر سی پی یو رجسٹر میں فٹ بیٹھتا ہے۔ کلاس کی قسم کے کسی بڑے آبجیکٹ کو واپس کرنے کے لیے میموری کے ایک مقام سے دوسرے مقام پر زیادہ مہنگی کاپی کی ضرورت پڑ سکتی ہے۔ اس سے بچنے کے لیے، عمل درآمد کال کرنے والے کے اسٹیک فریم میں ایک پوشیدہ آبجیکٹ بنا سکتا ہے، اور اس آبجیکٹ کا پتہ فنکشن میں منتقل کر سکتا ہے۔ فنکشن کی واپسی کی قیمت کو پھر پوشیدہ آبجیکٹ میں کاپی کیا جاتا ہے۔ اس طرح، کوڈ اس طرح: اسٹرک ڈیٹا {چار بائٹس [16] ؛} ؛ ڈیٹا F () {ڈیٹا نتیجہ = {} ؛// نتیجہ واپسی کا نتیجہ پیدا کریں ؛} int مین () {ڈیٹا d = F () ؛} اس کے مساوی کوڈ تیار کر سکتا ہے: اسٹرک ڈیٹا {چار بائٹس [16] ؛} ؛ ڈیٹا * F (ڈیٹا * _ ہائنڈ ایڈریس) {ڈیٹا نتیجہ = {} ؛// نتیجہ کو ہائنڈ آبجیکٹ میں کاپی کریں * _ ہائنڈ ایڈریس = نتیجہ ؛ ریٹرن _ ہائنڈ ایڈریس ؛} int مین () {ڈیٹا _ ہائنڈ ؛// ہائنڈ آبجیکٹ ڈیٹا d = * F (& _ ہائنڈ) بنائیں ؛// نتیجہ کو d میں کاپی کریں جس کی وجہ سے ڈیٹا آبجیکٹ کو دو بار کاپی کیا جاتا ہے۔ سی + + کے ارتقاء کے ابتدائی مراحل میں، زبان کی کسی فنکشن سے کلاس قسم کی شے کو مؤثر طریقے سے واپس کرنے میں ناکامی کو کمزوری سمجھا جاتا تھا۔ 1991 کے آس پاس، والٹر برائٹ نے کاپی کو کم سے کم کرنے کے لیے ایک تکنیک نافذ کی، جس نے فنکشن کے اندر پوشیدہ آبجیکٹ اور نامزد آبجیکٹ کو مؤثر طریقے سے اس آبجیکٹ کے ساتھ تبدیل کیا جو نتیجہ کو برقرار رکھنے کے لیے استعمال ہوتا ہے: اسٹرک ڈیٹا [چار بائٹس [16] ؛} ؛ وایڈ ایف (ڈیٹا * پی) {// نتیجہ براہ راست * پی} انٹ مین () {ڈیٹا ڈی ؛ ایف (& ڈی) ؛} برائٹ نے اپنے زورٹیک سی + + مرتب میں اس اصلاح کو نافذ کیا۔ اس مخصوص تکنیک کو بعد میں "نیمڈ ریٹرن ویلیو آپٹیمائزیشن" (این آر وی او) بنایا گیا، اس حقیقت کا حوالہ دیتے ہوئے کہ کسی نامزد شے کی کاپی کو ختم کر دیا گیا ہے۔ زیادہ تر مرتب کرنے والوں پر کمپائلر سپورٹ ریٹرن ویلیو آپٹیمائزیشن کی حمایت کی جاتی ہے۔ تاہم، ایسے حالات ہو سکتے ہیں جہاں مرتب کرنے والا اصلاح انجام دینے سے قاصر ہو۔ ایک عام معاملہ یہ ہے کہ جب کوئی فنکشن پھانسی کے راستے کے لحاظ سے مختلف نامزد اشیاء کو واپس کر سکتا ہے: #include <سٹرنگ> std:: سٹرنگ F (بول کنڈ = فالس) {std:: سٹرنگ فرسٹ ("فرسٹ") ؛ std:: سٹرنگ سیکنڈ ("سیکنڈ") ؛// فنکشن اپنی دلیل کے لحاظ سے دو نامزد اشیاء میں سے ایک کو واپس کر سکتا ہے۔ کیا آر وی او کا اطلاق ریٹرن کنڈ پر نہیں کیا جا سکتا ہے؟ پہلا: دوسرا ؛} int مین () {std:: سٹرنگ نتیجہ = F ();} بیرونی لنکس cppreference.com حوالہ جات پر کاپی ایلیژن مضامین مثال کے طور پر C + + کوڈ مرتب کی اصلاح C + + کے ساتھ