我第一次尝试理解boost::asio。我的理解是执行者,您可以放置一个处理程序,这是任何有像void()这样的签名的东西。
asio清除处理程序中可执行文件的类型,以便我可以将std::function<void()>、lambda等放入队列中。它是否在内部将所有类型转换为boost::function<void()>,从而导致堆分配和可能的运行时vtable分派?
如果您知道在哪里查找源,这将是非常有用的,请。
发布于 2022-09-09 09:51:28
您所要求的主要是实现细节。
然而,你所关心的问题是有道理的。事实上,它们是Asio设计选择的核心。参见例如asio/概述/模型/分配程序
特别是,Asio非常努力地将分配最小化,另外还允许调用方使用它们的处理程序指定自定义分配程序。请参阅asio/概述/core/allocation.html
更具体地说,处理程序执行的一个有时被忽略的规范要求是文档。
如果异步操作需要临时资源(例如内存、文件描述符或线程),则在调用完成处理程序之前释放该资源。
理由如下:
通过确保在完成处理程序运行之前释放资源,我们避免了使操作链的峰值资源使用量加倍。
现在,关于实现细节的主题,您可以检查它的实现。注意,在选择完成令牌和其他事情(例如是否禁用C++异常)方面,细节有所不同,但是对于简单的
boost::asio::io_context io;
post(io, []{});您可以从initiate_post_with_executor开始,最终将您的操作包装在asio::detail::executor_op中,它仔细维护前面提到的取消分配顺序保证(请参阅注释)。
离题
没有回答您的问题,但可能是您真正关心的问题:如果您担心使用Asio的性能开销,我会使用分析器。
你可能会发现你的瓶颈在其他地方。特别是,您将希望知道
asio::any_io_executor)的默认执行器中的类型擦除和引用计数。我个人不喜欢这种默认设置,尽管从用户友好的角度来看,这是有意义的。请注意,这些通常不是一个大问题,许多微观优化适用,有时根本不需要队列完成,或者排队到线程本地操作,以减少锁争用等等,但仍然注意这些可以提高您的性能:Boost Asio实验信道性能差,https://chat.stackoverflow.com/transcript/230461?m=51873813#51873813。
https://stackoverflow.com/questions/73658858
复制相似问题