0%

前几日,一个刚学编程的老朋友问了我一个问题:

int i = 0;
i = i ++;
printf(“%d\n”, i);

为什么打印i的值是1而不是0?

这种undefined的问题在网上是讨论烂了的。一般会纠结这种问题的同学,多半是看了本烂书。

我给这位老朋友看了一篇裘宗燕先生的文章,他立马就明白了问题所在,并不再纠结于类似的问题了。

阅读全文 »

1996年,公牛vs超音速第六场,那一年我还未满6岁,观看的第一场NBA比赛,最终87比75,乔丹获得了复出后的第一座冠军奖杯,正式拉开了他第二个三连冠的序幕。

1997年,公牛4比2战胜了爵士,总冠军。

1998年,同样是4比2,公牛战胜了爵士,乔丹第二个三连冠。在后来的好多年记忆里,我对乔丹的画面都定格在这第六战的最后一刻:

比赛还剩下22.7秒,卡尔马龙在低位三秒区附近要位,接到斯托克顿的传球,准备背身单打,此刻,乔丹鬼魅般的出现在他身后,断下了球。接着缓慢运球推进到前场,看了看计时器,大约还剩10秒的时候,压低重心,一个加速启动向右前方突破,然后突然拉回,跳投命中,已经被晃开的拜伦拉塞尔只能无奈的看着这一切。

接着,乔丹退役了。

年幼时的小孩,不知愁滋味,只是发觉没有了乔丹的NBA似乎没什么意思了,再也找不到一个打球像他那么飘逸灵动,仿佛只要他在场就不担心会输球的球员了。以至于在后来好多年里,在我眼里的篮球明星只有乔丹一人。

然而,有意思的是,同样是1996年,也就是我开始看球的第一年,一个叫做科比布莱恩特的小伙子来到了NBA。

阅读全文 »

本文整理自之前我在公司内部培训上的演讲ppt

编译概要

阶段:

  • 词法分析
  • 语法分析
  • 语义分析
  • 代码优化
  • 代码生成

划分:

  • 编译前端,包括词法分析、语法分析、语义分析
  • 编译后端,包括代码优化、代码生成

流程:

阅读全文 »

又到了这个时候,明天就要收拾东西回家过年了,只不过始发站从去年的苏州变成了北京。回想去年的这个时候还一边加紧的学习技术知识,一边担心来年能不能顺利找到合适的工作,不得不感叹时间确实过的挺快的。

2015年主要做了2件事。一是换了份工作,5月份从苏州辞职只身来到北京找工作,最终顺利的拿了到6个offer,这也要感谢Jordan、C哥在这个过程中给我的帮助。第二个就是迅速的融入了工作团队,顺利的完成了笑傲江湖新资料片的服务端开发任务,从中熟悉了不少大型端游服务端业务的特点以及处理实际线上问题的方法。

这一年工作上最大的感悟就是工作上需要professional。这里的professional不是指专业技术,而是指工作的时候不要受个人情绪影响,生活是生活,工作是工作,不能让个人情绪影响工作效率。

新的一年也希望自己能做好两件事吧,一是熟悉整个项目的代码结构及业务特点,二是学习编译原理和编程语言设计。至于其他的就顺其自然吧,不必强求。

在现代C++中,通过使用shared_ptr这样的智能指针能够很好的降低内存泄漏的可能性,但是在多线程中无保护的读写shared_ptr则有可能带来race condition的情况。

对此,boost官方文档是这样描述的:

shared_ptr 对象提供与内建类型一样的线程安全级别。一个 shared_ptr 实例可以同时被多个线程“读”(仅使用不变操作进行访问)。不同的 shared_ptr 实例可以同时被多个线程“写入”(使用类似operator=reset 这样的可变操作进行访问)(即使这些实例是拷贝,而且共享下层的引用计数)。

从 Boost 版本 1.33.0 开始,shared_ptr 在以下平台上使用了 lock-free 实现:

  • GNU GCC on x86 or x86-64;
  • GNU GCC on IA64;
  • Metrowerks CodeWarrior on PowerPC;
  • GNU GCC on PowerPC;
  • Windows.
    可以看到现在版本的shared_ptr本身的引用计数是安全并且无锁的,但是shard_ptr对象本身则不是,为什么呢?

简单来说,因为shared_ptr有不止引用计数一个数据成员,它有指向引用计数对象的指针和指向实际数据的指针这两个成员,虽然引用计数本身是原子化的,但是两个成员一起作为一个对象在多线程环境下读写时,就不能原子化了。

数据结构模型

shared_ptr是引用计数类型的智能指针,并且绝大多数实现都是存放在堆上的空间里。

具体来说,一个shared_ptr包含两个成员,一个是指向实际数据Foo的指针,一个是指向堆上的引用计数对象的指针ref_count。引用计数对象有多个数据成员,具体如上图所示,其中allocator和deleter是可选的。

阅读全文 »