当前位置: 首页 > news >正文

for循环里如果std::pair的类型写不对,可能会造成性能损失

第一版

    std::map<int, int> t;t.emplace(1, 1);for (const std::pair<int,int>& data : t){int i = 0;std::ignore = i;}中间留一些空格,是因为ms在调试的时候,尤其是模板比较多的时候,经常断点的行号有问题。比如第5行的断点,需要打在第4行。
如果代码之间没空行,经常断点会搞错。

把端点下在:for (const std::pair<int,int>& data : t)

发现调用了构造函数,既然调用了构造函数,那么就存在拷贝的可能性,这里是int所以没关系,如果first和second是类,就会发生拷贝动作:

D:\DevTools\VS2017\VC\Tools\MSVC\14.16.27023\include\utility

看其堆栈:

拷贝出来:

std::pair<int,int>::pair<int,int><int const ,int,0>
(const std::pair<int const ,int> & _Right={...}

)

其中,std::pair<int,int>::pair<int,int>就是构造函数,就是for (const std::pair<int,int>& data : t)里的std::pair<int,int>& data,显式指定的类型。

0就是enable_if出来的结果。

思考:

由于构造函数也是个模板,所以它的参数也是推导出来的,参数的类型是const std::pair<int const ,int> & _Right={...}

也就是说推导出来的key的类型是int const,value的类型是int,那么它所对应的std::pair应该是std::pair<int const,int>。而for循环里显式指定了std::pair<int,int>,所以这里面就产生了一个拷贝构造函数的动作。可以认为const std::pair<int,int>是一个临时对象?

改个写法,key上添加const

    std::map<int, int> t;//t.emplace(1, 1);for (const std::pair<const int,int>& data : t){auto x = std::make_unique<int>();}

这个时候,就不会走pair的构造函数了。

最好的办法是用for(const auto& data : t),这种写法也不会走std::pair的构造函数。这种比较保险,因为是它推导出来的类型。

http://www.lryc.cn/news/354228.html

相关文章:

  • 【Linux】Linux的基本指令_2
  • Effective C++(3)
  • 自定义RedisTemplate序列化器
  • Flutter 中的 CupertinoContextMenuAction 小部件:全面指南
  • Element-Ul快速入门
  • Django的模型层——2模型实例
  • Python筑基之旅-MySQL数据库(四)
  • OceanBase SQL 诊断和调优实践——【DBA从入门到实践】第七期
  • C++之std::is_trivially_copyable(平凡可复制类型检测)
  • 宝石收集,tarjan
  • python 面对对象 类 继承
  • Rust腐蚀怎么用服务器一键开服联机教程
  • 公共代理IP和独享代理IP之间的区别?
  • 基于Vue的前端自定义询问弹框与输入弹框组件的设计与实践
  • 淘宝订单系统ERP中如何接入平台订单信息?(订单API)
  • 在Spring Boot项目中集成和使用MQTT
  • 14、设计模式之访问者模式
  • Excel如何换行不换格
  • Elasticsearch 8.1官网文档梳理 - 十五、Aggregations(聚合)
  • 计算机系统概论
  • 【Vue】diff 算法
  • Spring Boot 3.x 与 Spring Boot 2.x 的对比
  • SSLError ClosedPoolError
  • 勒索软件分析_Conti
  • Linux系统如何通过编译方式安装python3.11.3
  • 仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点 、 面试题 02.07. 链表相交、142.环形链表II
  • 吉林大学计科21级《软件工程》期末考试真题
  • AWS云服务器每月费用高昂,如何优化达到节省目的?
  • 关于XtremIO 全闪存储维护的一些坑(建议)