Жылдыруу семантикасына киришуу
Ала турган нерсени көчүрбөңүз — заманбап C++ ресурстарды кайра-кайра түзбөстөн, кантип жылдырат.
std::vector) ээ болгондо, аны көчүрүү бул ресурсту байт-байтка көбөйтөт. Жылдыруу болсо бар ресурстун ээлигин жаңы объектке өткөрүп, эскисин бош калтырат. Ошол эле натыйжа — эмгектин бир аз бөлүгү менен. Жылдыруу семантикасы — бул муну коопсуз жана автоматтык кылган тилдин мүмкүнчүлүгү (C++11де пайда болуп, ошондон бери өркүндөп келет).
- lvalue менен rvalue айырмалап, бул айырманын эмне үчүн маанилүү экенин түшүндүрө аласыз,
- көчүрүү канча турарын жана жылдыруу андан кантип качарын сүрөттөй аласыз,
std::moveтуура колдоно аласыз — жана ал өзү эч нерсени жылдырбай турганын түшүндүрө аласыз,- объектти жылдыргандан кийинки абалы жөнүндө ой жүгүртө аласыз,
- компилятор сиз үчүн автоматтык түрдө кайда жылдырарын тааныйсыз (кайтаруулар, контейнерлерге киргизүү).
1. lvalue менен rvalue: анын көрсөтө турган аты барбы?
C++те ар бир туюнтма же lvalue, же rvalue болот (майдараак категориялар да бар, бирок бул экөө маанисин берет). Аттар меншиктөөнүн тараптарынан келип чыккан: тарыхый жактан lvalue = белгисинин сол жагында, ал эми rvalue болсо оң жагында гана тура алмак.
- lvalue — бул туруктуу иденттүүлүккө ээ объект: эстутумдагы аты бар жай, анын дарегин алса болот. Өзгөрмөлөр — lvalue:
x,account.balance,numbers[3]. - rvalue — бул туруктуу аты жок убактылуу маани, жакында жоголчу туюнтманын натыйжасы. Литералдар жана көпчүлүк туюнтмалардын натыйжалары — rvalue:
42,a + b,std::string("hi"), функция кайтарган маани.
Практикалык текшерүү: эгер анын дарегин & аркылуу алса болсо — бул lvalue; болбосо — rvalue.
int x = 10;
int& a = x; // OK: x - lvalue, анын дареги бар
// int& b = 10; // КАТА: 10 - rvalue, байланыштыра турган дарек жок
int&& c = 10; // OK: rvalue-ШИЛТЕМЕ убактылуу 10го байланыша алат
int&& d = x + 5; // OK: (x + 5) - убактылуу rvalue
Синтаксистин акыркы бөлүгү — int&&, кош амперсанд — бул rvalue-шилтеме. Бул rvalueга (убактылууларга) гана байланыша турган шилтеме. Жылдыруу семантикасы ушуга илинет: функция бир перегрузканы const T& үчүн (баарына байланышат, өзгөртпөйм деп убада берет), экинчисин T&& үчүн (чакыруучуга эми кереги жок убактылууларга гана байланышат) сунуштай алат. Экинчиси тандалганда, функция аргументтин ичин алуу коопсуз экенин билет.