我正试图找到一种方法,在使用带有asio::use_awaitable和C++20协同程序的boost::beast时挂接自定义分配器。给定此功能草图:
asio::awaitable<void> process_request(asio::ip::tcp::socket sock)
{
// Prepare the beast http buffer and request stuff using the custom allocator
...
fmt::print(stdout, "Readingn");
co_await http::async_read(sock, buffer, req, asio::use_awaitable);
fmt::print(stdout, "Done readingn");
// Prepare the beast http buffer and response stuff using the custom allocator
...
fmt::print(stdout, "Writingn");
co_await http::async_write(sock, res, asio::use_awaitable);
fmt::print(stdout, "Done!nn");
}
以及覆盖全局运算符new/delete,我对分配进行了一些跟踪,并将大部分分配挂接到自定义分配器。以下是我的问题:
- 如何在使用
use_awaitable
时为读/写处理程序挂接自定义分配器?我看到在读取打印之间有288字节的分配,在写入打印之间有408字节的分配。我想这些是asio内部为处理程序所做的分配。我在这里读过关于如何为回调hadnler提供自定义分配器的文章,但我不知道如何为这种完成令牌提供自定义分配器。Asio似乎提供了一种将分配器与use_future
挂钩而不与use_awaitable
挂钩的方法 - 如何将自定义分配器提供给asio机器,使其用于协程框架分配?据我所知,我可以为协程promise类型覆盖运算符new/delete,但这种类型隐藏在asio机制中。除此之外,我无法在打印中看到上述协同程序的分配。我在上面的函数中有1024字节的堆栈缓冲区,在我的打印中没有看到这么大的分配
谢谢。
我问了自己同样的问题(只是出于好奇,所以我自己没有测试以下内容(,并在(ASIO创建者(对原始ASIO存储库中的github问题的一些评论中找到了答案。注释的示例代码可以在下面找到。
awaitable<void> foo()
{
my_pre_allocatated_storage_type my_storage;
my_custom_allocator my_alloc(my_storage);
...
co_await my_operation(/*...*/, bind_allocator(my_alloc, use_awaitable));
}
但是使用的bind_allocator调用是在24上添加的。2022年2月,目前没有出现在Boost.Asio(Boost1.78.0(中。如果你想通过Boost使用此功能,你可能只需要等待一段时间。