免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖

[C++] 。。。。。。 [复制链接]

论坛徽章:
0
发表于 2012-11-15 11:02 |显示全部楼层
lamda玩得转么?  tuple类是怎么实现的?  知道有变长模版参数列表么, 用这个实现个printf如何?   shared_ptr, weak_ptr这些东西怎么用,怎么实现的?

lambda还是 lamda?如果是 lamda这个连听都没听过,tuple这东西,在chrome源码第14版里面,貌似有这玩意。weak_ptr跟shared_ptr没用过,只用过chrome的scoped_ptr,scoped_refptr,weak_ptr。chrome的weak_ptr的实现,其思想就是引入一个flag,这东西是引用计数的,也是线程安全的,它知道这个弱指针什么时候,保存的那个指针不再有效了

论坛徽章:
0
发表于 2012-11-23 14:19 |显示全部楼层
回复 4# gtkmm


    战略性mark

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
发表于 2013-01-20 09:13 |显示全部楼层
回复 51# 耗资喜欢猫


    lamda是伦敦音乐戏剧艺术学院的简称(来自有道词典

对weak_ptr的解释错了。实现也不了解,而且对其行为也存在某种误解。另外,weak_ptr的使用会带来某种性能问题(它会自带某种顺序表)。

论坛徽章:
0
发表于 2013-01-21 17:09 |显示全部楼层
OwnWaterloo 发表于 2012-08-08 17:45
回复 4# gtkmm

编译器bug好玩。。。
  1. struct A { };
  2. A Test()
  3. {     
  4.       return A();
  5. }
  6. int main()
  7. {     
  8. A a;     
  9. Test()=a;     
  10. A*p=&Test(); //这个按照c++03标准是应该编译不过去的,但vs2008和g++的一些版本可以
  11. }
复制代码

论坛徽章:
0
发表于 2013-01-21 19:31 |显示全部楼层
struct A { };

A& Test1()
{     
        return A();
}
const A& Test2()
{     
        return A();
}
int main()
{
        const A& a2=Test2();
        A& a1=Test1();//按照c++03应该编译不过去,但vc2008可以
       
}

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2013-01-23 16:31 |显示全部楼层
回复 53# starwing83

貌似一个简单的weak_ptr只需要计数就够了

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
发表于 2013-01-23 16:36 |显示全部楼层
回复 56# windoze


    计数是不够的………………

你要保证,“在释放了以后,将所有的指针置为NULL”,单纯计数可能导致野指针的问题。或者至少是与语义不符合的延时释放。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2013-01-23 17:01 |显示全部楼层
回复 57# starwing83

这个可以解决。
简化一下问题,假如weak_ptr只和shared_ptr合作,不能和裸指针合作(Boost的保证也仅止于此)。
那么可以这么做:
为每个需要shared_ptr/weak_ptr管理的对象单独分配一个计数对象,其中包含一个指针,指向真实的对象,还有2个计数,一个是shared counter,另一个是weak counter。
shared counter用来管理真实对象的生存期,weak counter用来管理计数对象本身的生存期,即,当shared counter和weak counter都为0时,销毁计数对象,因为此时没有任何shared_ptr和weak_ptr在使用这个计数对象。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
发表于 2013-01-27 09:53 |显示全部楼层
回复 58# windoze


    恩,想了想,这个方案的确可行。

不过如果这样的话,支持或者不支持weak_ptr的shared_ptr的结构本身就不一样了。即使不使用weak_ptr,shared_ptr也得付出代价(单独的计数对象)。

另外,即使是这样,也不是单纯一个flag就能解决的

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2013-01-27 13:42 |显示全部楼层
回复 59# starwing83

要实现gc_ptr/weak_ptr,大致就几种方式
在有裸指针的语言中可以用ref counting,当然一个单独的计数对象估计是跑不了的,要不就只有用侵入式方案,把计数器放在真实对象里面,但这样就没法支持weak_ptr了。
还可以使用保守型GC(如boehmgc),此时每个裸指针都是gc_ptr,但是weak_ptr有额外的开销,必须给每个对象用一个weak_ptr列表,在对象销毁的时候把weak_ptr列表里的weak_ptr全部reset,因为保守型GC扫描内存时并不能保证准确的识别出每一个weak_ptr对象并reset。
如果用AccurateGC+ManagedStack(JVM和.Net差不多就是这种),这个问题倒是可以简化,因为GC可以精确的扫描每一个对象,但是这种方案就不能直接支持裸指针。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP