Мазмунга өтүү

Жылдыруу семантикасына киришуу

Сабактын башталышы

Жылдыруу семантикасына киришуу

Ала турган нерсени көчүрбөңүз — заманбап 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&& үчүн (чакыруучуга эми кереги жок убактылууларга гана байланышат) сунуштай алат. Экинчиси тандалганда, функция аргументтин ичин алуу коопсуз экенин билет.

Эмне үчүн «туруктуу аты жок» маанилүү? Анткени эгер маани баары бир жакында жок кылынчу убактылуу объект болсо, аны акырын бошотуп койгонубузду эч ким байкабайт. Дал ушул уруксат жылдырууну коопсуз кылат.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө