能否使用alloca为C++协程分配内存?
C++协程:借助
alloca实现栈内分配的可行性分析 默认情况下,C++20协程依赖全局operator new分配内存,和Rust支持栈分配的协程相比,会带来显著的性能开销。实际上多数协程场景完全适合栈分配——比如创建后立即co_await,或者将其与其他协程通过组合器一同co_await。
你可以通过重载promise类型的operator new和operator delete,实现基于预分配堆区域的严格FIFO自定义分配器,但复用当前线程已存在且缓存热的栈显然是更优的方案。
直接在operator new中使用alloca的问题
直接在promise的operator new内调用alloca无法达成目标:alloca分配的内存会在函数(即operator new)返回时自动释放,根本无法留存给协程使用。
预分配栈空间的局限性
你可以在顶层函数中用alloca预先分配一块大内存区域,再让promise的operator new从该区域内分配内存。但这种方式在缓存热度上和单独的堆分配区域并无本质区别——协程使用的是独立的“冷”区域,无法与常规调用的栈顶缓存热区混合,也就无法发挥栈分配的真正性能优势。
可行的alloca用法是否存在?
目前没有直接可行的方法能让alloca实现协程内存的栈内分配。需要明确的是,这里讨论的是在协程运行前用alloca为协程本身分配内存,和“协程内部调用alloca”是完全不同的问题。此外,虽然有讨论C++无栈协程设计合理性的相关内容,但这些内容既未提及alloca,也未回应Rust栈分配协程已验证的技术可行性。
内容的提问来源于stack exchange,提问作者Joseph Garvin
相关产品推荐
相关产品推荐

