为什么函数对象在for_each中会析构三次
2015-11-05 16:46
190 查看
?
1
2
3
4
5
===========GAP===============
Functor()
1/1
2/3
3/6
4/10
5/15
~Functor()
~Functor()
~Functor()
三次析构的原因:
先附上for_each的源码(VC2008)
?
?
如果把代码改变下:
?
运行结果
Functor()0032F800 //main函数中的实参仿函数对象
Copy Functor()0032F68C //值传递 对【实参对象】拷贝构造了形参对象
1/1
2/3
3/6
4/10
5/15
Copy Functor()0032F7E8 //返回对象的值类型 对【形参对象】拷贝构造
~Functor()0032F68C //析构形参对象
15
~Functor()0032F7E8 //析构返回值对象
~Functor()0032F800 //析构实参对象
现在一目了然了吧!
个人认为使用回调函数高效 由上面的例子可以看出 构造1次 拷贝构造2次 析构3次 是有代价的
最后回到仿函数和回调函数
区别在于:
使用仿函数可以声明在业务相关的类内部 缩小作用域
使用仿函数可以使用类的成员属性和成员函数
仿函数是一个类 可以使用面向对象的各种机制(封装
继承 多态)
若使用回调函数 那么只能声明为某个类的静态成员函数或全局函数,使用类内部的资源需要用一些手段传参,没有直接使用成员函数便捷
2
3
4
5
===========GAP===============
Functor()
1/1
2/3
3/6
4/10
5/15
~Functor()
~Functor()
~Functor()
三次析构的原因:
先附上for_each的源码(VC2008)
?
?
Functor()0032F800 //main函数中的实参仿函数对象
Copy Functor()0032F68C //值传递 对【实参对象】拷贝构造了形参对象
1/1
2/3
3/6
4/10
5/15
Copy Functor()0032F7E8 //返回对象的值类型 对【形参对象】拷贝构造
~Functor()0032F68C //析构形参对象
15
~Functor()0032F7E8 //析构返回值对象
~Functor()0032F800 //析构实参对象
现在一目了然了吧!
个人认为使用回调函数高效 由上面的例子可以看出 构造1次 拷贝构造2次 析构3次 是有代价的
最后回到仿函数和回调函数
区别在于:
使用仿函数可以声明在业务相关的类内部 缩小作用域
使用仿函数可以使用类的成员属性和成员函数
仿函数是一个类 可以使用面向对象的各种机制(封装
继承 多态)
若使用回调函数 那么只能声明为某个类的静态成员函数或全局函数,使用类内部的资源需要用一些手段传参,没有直接使用成员函数便捷
相关文章推荐
- 使用ViewFLow制作循环滑动广告牌
- Android ViewPager等自制图片轮播器
- IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果
- 【解决方法】【使用】MKNetworkKit的介绍和应用
- fir.im Weekly - 30 天从 0 开始学 Swift
- 随堂笔记
- 【LeetCode从零单刷】Longest Increasing Subsequence
- Java语言基础之封装类
- java服务端解决js跨域的问题
- 14.2.2.1 InnoDB Lock Modes
- 深入浅出RxJava四-在Android中使用响应式编程
- 清除浮动的方法
- Android-异步消息处理机制(Handler,Looper,Message)
- 电商网站接入快递查询
- Tomcat服务器的安装配置图文教程(推荐)
- JAVA学习_02: 包装类、拆箱和装箱详解
- Java基础面试题02
- jenkins基础
- NSProgress
- SVN迁移到Git的过程(+ 一些技巧)