摘要: 关于RAII(Resource Acquisition Is Initialization),以下两点是关键。获得资源后立刻放进管理对象(managing object)内: 在获得一笔资源后与同一语句内以它初始化某个管理对象。管理对象运用析构函数确保资源被释放: 无论控制流如何离开程序块,一旦对象被销毁(例如当对象离开作用域),其析构函数自然会被自动调用,于是资源被释放。一,常见用法RAII最常见的应用就是智能指针。我们知道对于程序块中动态分配的堆对象,应该保证当控制流离开程序块时被释放。 1: void func() 2: { 3: Foo* foo = new Foo; 4... 阅读全文
posted @ 2012-07-14 03:45 richfox 阅读(327) 评论(0) 推荐(0) 编辑
摘要: 我所在一家德国软件公司每逢大赛(世界杯,欧锦赛)都要组织大家小赌怡情一把,就是大家都出点钱,竞猜所有比赛结果并积分,最后把这笔钱奖励给前三名。为公平起见使用第三方提供的网页平台,比方这个。本人不才,也曾博得头位,拿过奖金,于是就有了想法,要把在竞猜中用到的方法,感觉,技巧等等罗列出来,和大家分享,也方便日后温故知新。一,概率球场上风云万变,诸多因素交杂在一起,谁都说不准下一分钟会发生什么,除非你是神兽。所以很显然,赌球就是赌个概率。那么先说说概率。赛前的功课是不能少的,什么球队内幕,球星受伤,这些都是要收集的信息。你不能期望没有鲁小胖的英格兰锋线能洞穿意大利的钢铁后防线,你也不能期望内抗不断的 阅读全文
posted @ 2012-07-01 13:38 richfox 阅读(2250) 评论(8) 推荐(3) 编辑
摘要: 学习设计模式有一段时间了,现想小结一下,说说我对类的设计的一些常用法则的理解。一,SOLID法则:Single responsibility principle每个类仅仅承担一个具体的任务。特别是那些明显不属于类的功能,应该封装到新的类里去。界面和逻辑的分离就是个很好的例子。Open/Closed principle软件开发必须考虑可扩展性,但是扩展不能更改现有的代码,否则可能更引起大范围的连锁反应。设计类的时候,可以通过抽象来隔离变化,并通过继承来实现变化。Liskov substitution principle如果派生类B公有继承了基类A,即类B是类A的子类型,那么子类型就能够替换掉父类 阅读全文
posted @ 2012-06-28 20:10 richfox 阅读(1972) 评论(4) 推荐(1) 编辑
摘要: 先看下构架,异步代理库(Agents Library)的位置和并行库相似:异步编程模式用的是数据流,数据只有在可用的情况下才会被处理,这和习惯使用的控制流有很大区别。数据流就必然会用到消息传递函数和消息块,比方说A->B,A和B就是消息块,用来发送或接受消息,AB之间的通信由消息传递函数来完成。异步代理把任务调度有关操作封装成类,并定义有一系列生存状态,如下图所示,实线表示由用户调用,虚线表示由运行时调用。 自定义异步代理需要继承Concurrency::agent类并重写run函数。看下面MSDN提供的例子。例程从文件中读取数据,并用消息传递函数Concurrency::asend异步 阅读全文
posted @ 2012-04-25 20:07 richfox 阅读(1769) 评论(2) 推荐(0) 编辑
摘要: 并行依赖的是底层多线程处理机制,线程的创建和销毁,还有线程间的同步问题常常令人望而生畏。concrrency runtime提供的并行库Parallell Patterns Library (PPL)提高了线程处理机制的抽象级别,让C++多线程并行变得异常的简单。 阅读全文
posted @ 2012-04-21 06:56 richfox 阅读(1075) 评论(2) 推荐(1) 编辑
摘要: lambda表达式不是什么新玩意,熟悉.net的朋友一定不会陌生,但对于C++却是新标准C++0x推出后才有的,其功能之强大,堪称编程利器。一般认为lambda表达式是一个匿名函数,其返回类型是function对象,例如可以这样来声明:#include <functional>int main(){ // Assign the lambda expression auto f1 = [] (int x, int y) { return x + y; }; // Assign the same lambda expression to a function object. fu... 阅读全文
posted @ 2012-04-20 04:50 richfox 阅读(534) 评论(2) 推荐(1) 编辑