C++ Academy · Pelajaran

Melaksanakan Penjana Ringkas

Bina coroutine penjana yang menghasilkan nilai secara malas.

Pelajaran 2 daripada 414 langkah

Melaksanakan Penjana Ringkas ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Penjana sebagai Korutin

Penjana ialah korutin yang menghasilkan nilai satu demi satu. Setiap panggilan kepada penjana menghasilkan nilai seterusnya dan menangguhkan pelaksanaan.

Jenis Penjana

Takrifkan kelas dengan promise_type bersarang. Pengkompil menggunakannya untuk mengurus keadaan korutin.

template <typename T>
struct Generator {
    struct promise_type {
        T current_value;

        Generator get_return_object() {
            return Generator{std::coroutine_handle<promise_type>::from_promise(*this)};
        }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_void() {}
        std::suspend_always yield_value(T value) {
            current_value = value;
            return {};
        }
        void unhandled_exception() { std::terminate(); }
    };

    std::coroutine_handle<promise_type> h;
    // ... constructors, destructor, next() ...
};

Menggunakan Penjana

Setelah ditakrifkan, penjana terasa seperti kata kunci yield dalam Python.

Generator<int> counting() {
    int n = 0;
    while (true) co_yield n++;
}

auto g = counting();
for (int i = 0; i < 5; ++i) {
    std::cout << g.next() << " ";
}
// 0 1 2 3 4

coroutine_handle

Pengkompil mengembalikan std::coroutine_handle. Ia mewakili korutin yang ditangguhkan — Anda boleh memanggil resume(), destroy() atau memeriksa done().

Titik Penangguhan

Setiap co_yield menangguhkan pelaksanaan. Apabila pemanggil memanggil resume(), pelaksanaan diteruskan sehingga penangguhan seterusnya atau sehingga korutin tamat.

initial_suspend dan final_suspend

Dua titik penyesuaian:

  • initial_suspend — kembalikan suspend_always untuk permulaan malas; suspend_never untuk permulaan segera
  • final_suspend — mengawal pembersihan. Biasanya gunakan suspend_always untuk pemusnahan yang betul

C++23 std::generator

C++23 menambah std::generator dalam <generator>. Anda tidak lagi perlu membina sendiri jenis tersebut untuk kes biasa.

#include <generator>

std::generator<int> counting() {
    int n = 0;
    while (true) co_yield n++;
}

for Berasaskan Julat

Jika jenis penjana menyokong begin/end, for berasaskan julat akan berfungsi begitu sahaja.

for (int x : counting()) {
    if (x >= 10) break;
    std::cout << x;
}

Semantik Tarik berbanding Tolak

Penjana adalah berasaskan tarik — pemanggil mengawal lelaran. Korutin berasaskan tolak ialah tugas tak segerak.

Kes Penggunaan

Penjana sangat sesuai untuk:

  • Jujukan malas (Fibonacci, nombor perdana, pembaca fail baris demi baris)
  • Penstriman data tanpa membina keseluruhan data terlebih dahulu
  • Melakukan lelaran terhadap struktur seperti pepohon

Pertimbangan Memori

Bingkai korutin diperuntukkan pada timbunan secara lalai. Pengkompil mungkin menghapuskan peruntukan tersebut apabila pengembangan sebaris mengizinkannya — lakukan pengukuran apabila prestasi penting.

Pustaka untuk Diterokai

Untuk pembelajaran, cppcoro oleh Lewis Baker mempunyai jenis penjana dan tugas yang didokumentasikan dengan baik. Boost.Asio menyediakan I/O yang mesra korutin. Mulai C++23 dan seterusnya, sokongan pustaka standard turut tersedia.

Semakan Pantas

Apakah jenis pustaka standard C++23 untuk korutin penjana?

Ulang Kaji

Korutin penjana menghasilkan nilai secara malas dengan co_yield. Laksanakannya dengan kelas yang mengandungi promise_type. C++23 menyeragamkan std::generator. Penjana sangat sesuai untuk jujukan malas dan penstriman.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Melaksanakan Penjana Ringkas” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Melaksanakan Penjana Ringkas”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Melaksanakan Penjana Ringkas”?

Bina coroutine penjana yang menghasilkan nilai secara malas. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Melaksanakan Penjana Ringkas” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Konsep Coroutine: co_await, co_yield, co_return
  2. Melaksanakan Penjana Ringkas
  3. Tugasan Tak Segerak dan Jenis Awaiter
  4. Peruntukan Bingkai Coroutine
← Kembali ke C++ Academy