Async Programming
Comparing Coroutines in C++ and Rust 1
| Aspect | C++ Coroutines | Rust Coroutines (async/await) |
|---|---|---|
| Syntax & Usage | Uses co_await, co_yield, co_return inside coroutine functions. |
Uses async fn and .await. |
| Return Type | Coroutine functions can return various types, often requiring custom promise types and handle management. | async fn returns an object implementing the Future trait. |
| State Management | The coroutine’s state (including suspension points) is managed by the compiler and runtime, often requiring explicit handle manipulation. |
The state machine is generated by the compiler, and the runtime (like Tokio) schedules and polls these futures. |
| Scheduling | No built-in scheduler; coroutines are “fire-and-forget” unless explicitly managed. The user or library must schedule and resume them. |
Requires an async runtime (e.g., Tokio, async-std) to poll and schedule futures. |
| Memory Safety | Relies on C++’s memory model; can be error-prone with manual memory management. |
Enforces strict memory safety via Rust’s ownership and borrowing rules. |
| Flexibility | Supports both stackless (standard) and stackful (via libraries) coroutines. |
Only stackless coroutines are supported; stackful coroutines are not part of Rust’s async model. |
| Underlying Model | Awaitables continue the coroutine from the bottom up (the callee resumes the caller). | The runtime polls the future from the top down (the executor drives progress). |
Note
- The Coroutines feature was officially added to C++20.
References
-
sourced from Perplexity ↩