Ma'lumotni nusxa ko'chirmasdan, mahalliy obyektni markerga aylantiradimi?

cnList sinfini egallagan, bu moslamalarning moslashuvchan sonini saqlaydi. Ushbu ro'yxat keyinchalik cnArray obyektiga aylantirilishi kerak. Ro'yxat sinf allaqachon bir usulni qo'llaydi: cnArray cnList :: toArray() const .

Ko'rib turganingizdek, biror moslamani emas, balki markerni ham qaytaradi. Lekin ro'yxatni bir qatorga o'zgartirgandan keyin nima qilishim kerak, bu qatorni keyinchalik sinf a'zosida ishlatish uchun saqlab qo'yish, ya'ni cnArray obyektiga ko'rsatgichga ega bo'lishim kerak.

Endi, haqiqiy muammo, oddiygina ishlatadigan usuldan keyin erkinlashtiriladi, chunki faqatgina massivlarni ishlatish manzili emas.

Ushbu obyektni ko'rsatgichga qanday qilib "aylantira" olaman va ob'ekt endi ozod emas? Albatta, men barcha arizalarni ob'ekt-qatordan nishonlangan qatorga nusxa olaman, lekin bu men istagan narsa emas, chunki u juda samarali emas.

cnArray obyektiga markerni qaytaradigan cnList da bir usulni amalga oshirishi mumkinligini bilaman, lekin bu haqda bilishni xohlayman.

3
@Jimmy nima uchun bunday bo'lishi kerak? Va bu mavzu bilan nima aloqasi bor?
qo'shib qo'ydi muallif Niklas R, manba
@BenjaminLindley Afsuski, qaysi usul qiymatiga qarab qaytib kelish kerak?
qo'shib qo'ydi muallif Niklas R, manba
CnArray'dagi harakatning semantikasini amalga oshirdingizmi? Nima uchun faqat qiymat bilan qaytish emasmi?
qo'shib qo'ydi muallif Benjamin Lindley, manba
cnList har qanday ma'lumotni hisoblashni tekshirganmisiz?
qo'shib qo'ydi muallif Jimmy, manba

4 javoblar

toArray ning qaytib qiymatidan qurilgan uyadan yangi cnArray ajratish mumkin. Agar siz buni to'g'ri bajaradigan bo'lsangiz, Qaytish bahosini optimallashtirish kompilyatorga kerakli nusxani optimallashtirishga imkon beradi:

cnArray *p = new cnArray(list.toArray());

To see that g++'s RVO will eliminate the copy, see http://ideone.com/loXAT

4
qo'shib qo'ydi
Qoyil. Aslida bu oddiy va ravshan, rahmat. Ishlar yaxshi!
qo'shib qo'ydi muallif Niklas R, manba

Ko'rsatkichlar hurmat bo'lishi mumkin va oddiy aholi sifatida ishlatilishi mumkin. Muammo siz avtomatik ravishda yig'ish obyektini ishlatadigan uyga ajratilgan ob'ektga aylantirmaysiz. Biroq, imkon bo'lsa, shared_ptr foydalanishni maslahat beraman.

cnArray* Ptr = new cnArray();
(*Ptr) = cnList::toArray();
0
qo'shib qo'ydi
Ushbu kodni ishlatish undefined natijalarni beradi. Saqlangan ma'lumotlar uzilib qolgan. Qaytganing uchun cnList :: toArray() belgisi ishlaydi, shuning uchun mening boshqa kodim emas.
qo'shib qo'ydi muallif Niklas R, manba

CnList ko'chirildi yangi cnArray-ga. cnArray :: ToList funktsiyasi mavjud cnArray uchun mos yozuvlar yoki markerni qabul qilish uchun yozilgan bo'lishi mumkin edi, ammo bu emas edi. Xabarni o'zgartirishingiz mumkin bo'lsa, buni ko'rib chiqing.

Orqaga qaytarilgan cnArray - bu o'z ichiga olgan holda yo'qoladigan mahalliy ob'ekt, va buni tushunishingiz mumkin. Sizning yagona tanlovingiz - bu sizning ob'ektingizning bir nechta o'zgaruvchisiga boshqa nusxasini yaratishdir.

Ba'zi C ++ kompilyatorlari ortiqcha nusxaning yaratilishiga to'sqinlik qiluvchi nusxa ko'chirish elision ni bajaradi. Vaqtinchalik qiymatga qaytish qiymatini belgilash o'rniga uni to'g'ridan-to'g'ri a'zo o'zgaruvchiga belgilang.

0
qo'shib qo'ydi

cnList :: toArray() ichida cnArray * obj ni dinamik ravishda ajratishingiz mumkin cnList ob'ektini obj Keyin obj kodini qaytaring. Xom (yoki aqlli) ko'rsatgichni qaytarib olmoqchi bo'lganingizdan so'ng, uning miqdori o'chirilganda ajratiladi.

0
qo'shib qo'ydi
Siz, menimcha, bu ob'ektni o'rniga ko'rsatgichni qaytaradigan usulni qo'llash orqali nimani nazarda tutganimni anglatadi. Bu chindan ham juda yaxshi ishlaydi, deb o'ylayman. Faqatgina yig'ish bo'yicha ob'ektni to'sib qo'yolmasligim qiziqib qoldi.
qo'shib qo'ydi muallif Niklas R, manba