首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost::asio委托类型删除

boost::asio委托类型删除
EN

Stack Overflow用户
提问于 2022-09-09 07:42:07
回答 1查看 46关注 0票数 1

我第一次尝试理解boost::asio。我的理解是执行者,您可以放置一个处理程序,这是任何有像void()这样的签名的东西。

asio清除处理程序中可执行文件的类型,以便我可以将std::function<void()>、lambda等放入队列中。它是否在内部将所有类型转换为boost::function<void()>,从而导致堆分配和可能的运行时vtable分派?

如果您知道在哪里查找源,这将是非常有用的,请。

EN

回答 1

Stack Overflow用户

发布于 2022-09-09 09:51:28

您所要求的主要是实现细节。

然而,你所关心的问题是有道理的。事实上,它们是Asio设计选择的核心。参见例如asio/概述/模型/分配程序

特别是,Asio非常努力地将分配最小化,另外还允许调用方使用它们的处理程序指定自定义分配程序。请参阅asio/概述/core/allocation.html

更具体地说,处理程序执行的一个有时被忽略的规范要求是文档

如果异步操作需要临时资源(例如内存、文件描述符或线程),则在调用完成处理程序之前释放该资源。

理由如下:

通过确保在完成处理程序运行之前释放资源,我们避免了使操作链的峰值资源使用量加倍。

现在,关于实现细节的主题,您可以检查它的实现。注意,在选择完成令牌和其他事情(例如是否禁用C++异常)方面,细节有所不同,但是对于简单的

代码语言:javascript
运行
复制
boost::asio::io_context io;
post(io, []{});

您可以从initiate_post_with_executor开始,最终将您的操作包装在asio::detail::executor_op中,它仔细维护前面提到的取消分配顺序保证(请参阅注释)。

离题

没有回答您的问题,但可能是您真正关心的问题:如果您担心使用Asio的性能开销,我会使用分析器。

你可能会发现你的瓶颈在其他地方。特别是,您将希望知道

  • IO对象(asio::any_io_executor)的默认执行器中的类型擦除和引用计数。我个人不喜欢这种默认设置,尽管从用户友好的角度来看,这是有意义的。
  • 执行上下文的操作队列上的同步

请注意,这些通常不是一个大问题,许多微观优化适用,有时根本不需要队列完成,或者排队到线程本地操作,以减少锁争用等等,但仍然注意这些可以提高您的性能:Boost Asio实验信道性能差https://chat.stackoverflow.com/transcript/230461?m=51873813#51873813

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73658858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档