随笔分类 -  c++11 使用c++11改进我们的程序系列

使用c++11改进我们的程序系列
(原创)用C++11的std::async代替线程的创建
摘要:c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的:void f(int n);std::thread t(f, n + 1);t.join(); 但是线程毕竟是属于比较低层次的东西,有时候使用有些不便,比如我希望获取线程函数的返回结果的时候,我就不能直接通过thread.join()得到结果,这时就必须定义一个变量,在线程函数中去给这个变量赋值,然后join,最后得到结果,这个过程是比较繁琐的。c++11还提供了异步接口std::async,通过这个异步接口可以很方便的获取线程函数的执行结果。std::async会自动创建一个线程去调用线程函数,它返回一个st... 阅读全文

posted @ 2014-01-26 16:40 qicosmos(江南) 阅读(56487) 评论(15) 推荐(24) 编辑

(原创)c++11中 function/lamda的链式调用
摘要:关于链式调用,比较典型的例子是c#中的linq,不过c#中的linq还只是一些特定函数的链式调用。c++中的链式调用更少见因为实现起来比较复杂。c++11支持了lamda和function,在一些延迟计算的场景下,这个链式调用的需求更强烈了。链式调用要实现的目是,将多个函数按照前一个的输出作为下一个输入串起来,然后再推迟到某个时刻计算。c++中,目前看到PPL中有这样的用法。PPL中链式调用的例子:int wmain(){ auto t = create_task([]() -> int { return 0; }); // Create a lam... 阅读全文

posted @ 2014-01-15 22:30 qicosmos(江南) 阅读(6734) 评论(13) 推荐(1) 编辑

(原创)谈谈boost.asio的异步发送
摘要:在上一篇博文中提到asio的异步发送稍微复杂一点,有必要单独拿出来说说。asio异步发送复杂的地方在于: 不能连续调用异步发送接口async_write,因为async_write内部是不断调用async_write_some,直到所有的数据发送完成为止。由于async_write调用之后就直接返回了,如果第一次调用async_write发送一个较大的包时,马上又再调用async_write发送一个很小的包时,有可能这时第一次的async_write还在循环调用async_write_some发送,而第二次的async_write要发送的数据很小,一下子就发出去了,这使得第一次发送的数据和.. 阅读全文

posted @ 2013-12-23 11:44 qicosmos(江南) 阅读(16141) 评论(10) 推荐(6) 编辑

(原创)一个和c#中Lazy<T>类似的c++ Lazy<T>类的实现
摘要:在.net 4.0中增加一个延迟加载类Lazy,它的作用是实现按需延迟加载,也许很多人用过。一个典型的应用场景是这样的:当初始化某个对象时,该对象引用了一个大对象,需要创建,这个对象的创建时需要较长的时间,同时也需要在托管堆上分配较多的空间,这样可能会在初始化时变得很慢,尤其是UI应用时,会导致用户体验很差。其实狠多时候并不需要马上就获取大数据,只是在需要时获取,这种场景就很适合延迟加载了。先看看c#中Lazy如何使用的吧:class LargeObject{ public int InitializedBy { get { return initBy; } } int ini... 阅读全文

posted @ 2013-10-25 22:36 qicosmos(江南) 阅读(3038) 评论(1) 推荐(3) 编辑

(原创)c++11改进我们的模式之改进命令模式
摘要:模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题;比如访问者模式中循环依赖的问题等等;其它很多模式也存在这样那样的一些不足之处,如使用场景受限、实现复杂、不够简洁、不够通用等。但我觉得不足之处大都是可以采取一些手法去弥补去改进的,比如用c++11的新特性来改进。因此,便有了c++11... 阅读全文

posted @ 2013-10-21 07:43 qicosmos(江南) 阅读(4091) 评论(2) 推荐(2) 编辑

(原创)C++11改进我们的程序之move和完美转发
摘要:本次要讲的是右值引用相关的几个函数:std::move, std::forward和成员的emplace_back,通过这些函数我们可以避免不必要的拷贝,提高程序性能。move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。如图所示是深拷贝和move的区别。 这种移动语义是很有用的,比如我们一个对象中有一些指针资源或者动态数组,在对象的赋值或者拷贝时就不需要拷贝这些资源了。在c++11之前我们的拷贝构造函数和赋值函数可能要这样定义:假设一个A对象内部有一个资源m_ptr;A& A::operator=(const A& rhs){// 阅读全文

posted @ 2013-10-18 16:06 qicosmos(江南) 阅读(11575) 评论(3) 推荐(5) 编辑

(原创)C++11改进我们的程序之右值引用
摘要:本次主要讲c++11中的右值引用,后面还会讲到右值引用如何结合std::move优化我们的程序。c++11增加了一个新的类型,称作右值引用(R-value reference),标记为T &&,说到右值引用类型之前先要了解什么是左值和右值。左值具名,对应指定内存域,可访问;右值不具名,不对应内存域,不可访问。临时对像是右值。左值可处于等号左边,右值只能放在等号右边。区分表达式的左右值属性有一个简便方法:若可对表达式用 & 符取址,则为左值,否则为右值。1.简单的赋值语句如:int i = 0;在这条语句中,i 是左值,0 是临时值,就是右值。在下面的代码中,i 可以被引 阅读全文

posted @ 2013-10-15 11:45 qicosmos(江南) 阅读(9048) 评论(2) 推荐(4) 编辑

(原创)一个简洁通用的调用DLL函数的帮助类
摘要:本次介绍一种调用dll函数的通用简洁的方法,消除了原来调用方式的重复与繁琐,使得我们调用dll函数的方式更加方便简洁。用过dll的人会发现c++中调用dll中的函数有点繁琐,调用过程是这样的:在加载dll后还要定义一个对应的函数指针类型,再调用GetProcAddress获取函数地址,再转成函数... 阅读全文

posted @ 2013-10-12 22:48 qicosmos(江南) 阅读(4954) 评论(8) 推荐(1) 编辑

(原创)发布一个C++版本的ORM库SmartDB(一)
摘要:先简单说说ORM的优点:提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句。简单易用, 可维护性好。隔离数据源,使得我们更换数据源时不用修改代码。SmartDB基础库 java和c#中有很多ORM框架,如c#中的entity framework、Linq to Sql、NHibernate等,java中有Hibernate、Mybatis等等,其它各种开源的ORM库多如牛毛。这应该得益于托管语言在这方面的优势。然而,c++的世界中,却鲜有ORM框架,c++中比较知名的ORM库应该是ODB了,但是ODB的使用比较麻烦,需要三个库,写的ORM代码还需. 阅读全文

posted @ 2013-09-27 01:17 qicosmos(江南) 阅读(6878) 评论(13) 推荐(3) 编辑

(原创)C++11改进我们的程序之简化我们的程序(八)
摘要:本次要讲的是如何通过泛型函数来简化我们的程序。 泛型函数除了之前介绍的一些优点外还有两个重要的优点1.消除重复逻辑,提高程序的内聚性和健壮性 泛型函数在某种程度上用来弥补泛型类型的不足。通过泛型类型T可以消除一些重复代码,当不同的类型具有相同的行为时,通过泛型擦除类型,达到消除重复简化代码的目的。例如:templateauto Add(T a, T b)->decltype(a+b){ return a + b;}void TestAdd(){ auto r1 = Add(1, 2); //3 auto r2 = Add(1.2, 3.5); //4.7 aut... 阅读全文

posted @ 2013-09-17 21:20 qicosmos(江南) 阅读(2645) 评论(0) 推荐(1) 编辑

(原创)C++11改进我们的程序之简化我们的程序(七)
摘要:这次要讲的内容是:c++11中的tuple(元组)。tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多细节,要揭开它神秘的面纱时又比较困难。 tuple是一个固定大小的不同类型值的集合,是泛化的std... 阅读全文

posted @ 2013-09-12 22:30 qicosmos(江南) 阅读(22328) 评论(7) 推荐(5) 编辑

(原创)C++11改进我们的程序之简化我们的程序(六)
摘要:这次要讲的内容是:c++11中的lamda表达式。 lamda表达式是我最喜欢的一个c++11特性之一,在我的代码中随处可见它的身影,其实在c#3.5中就引入了lamda,java中至今还没引入,要等明年的java8中才有lamda表达式,lamda来源于函数式编程的概念,也是现代编程语言的一个特点。c++11这次终于把lamda加进来了。也许有人要问,lamda有什么好处,为什么要加到c++中来?lamda表达式有这些优点:声明式编程风格:就地匿名定义你的目标函数或函数对象,不需要额外的写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护性。简洁:不需要额外再写一个函... 阅读全文

posted @ 2013-09-05 22:20 qicosmos(江南) 阅读(3543) 评论(3) 推荐(3) 编辑

(原创)C++11改进我们的程序之简化我们的程序(五)
摘要:这次要讲的是:c++11中的bind和functionstd::function它是函数、函数对象、函数指针、和成员函数的包装器,可以容纳任何类型的函数对象,函数指针,引用函数,成员函数的指针。以统一的方式处理函数、函数对象、函数指针、和成员函数。允许保存和延迟执行函数。函数和成员函数作为functionvoid G();struct A{void H(){}};std::function f = G; //全局函数A a;std::function f 1= std::bind(&A::H, a); //成员函数可以用function取代函数指针。因为它可以保存函数延迟执行,所以比较 阅读全文

posted @ 2013-09-04 21:44 qicosmos(江南) 阅读(9922) 评论(2) 推荐(2) 编辑

(原创)C++11改进我们的程序之简化我们的程序(四)
摘要:这次要讲的是:c++11统一初始化、统一begin()/end()和for-loop循环如何简化我们的程序初始化列表c++11之前有各种各样的初始化语法,有时候初始化的时候还挺麻烦,比较典型的如vector和map的初始化。vector v;for(int i=0;i map;for(int i=0;i v = {0,1,2,3,4,5,6,7,8,9};map map = {{0,0},{1,1},{2,2,{3,3}};不用再手动去push_back或者insert了,这样写很简单也很直观。不仅仅是容器的初始化可以这样,普通的数组也可以这样写:int int_array[3] = {1,2 阅读全文

posted @ 2013-09-03 22:16 qicosmos(江南) 阅读(2438) 评论(4) 推荐(2) 编辑

(原创)C++11改进我们的程序之简化我们的程序(二)
摘要:这次要讲的是:C++11如何通过组合函数来简化我们的程序。关于组合函数,大家可能对这个概念有点陌生。组合函数是将N个一元函数组成一种更复杂的函数,每个函数的返回值作为参数传给下一个函数,直到传到最后一个函数结束。这种组合函数的能力可以使我们以一种更直观的方式去完成复杂的链式执行行为。例如有三个函... 阅读全文

posted @ 2013-08-30 21:14 qicosmos(江南) 阅读(3022) 评论(2) 推荐(0) 编辑

(原创)C++11改进我们的程序之简化我们的程序(一)
摘要:C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注。这次要讲的是:C++11如何通过获取函数模板的返回值类型来简化我们的程序。在谈到简化之前,我们先看一个问题,这个问题也是我前段时间在开发C++版本的linq时遇到的。假设我们现在需要将集合按某种属性分组,就是类似于sql语句中的group by,我们知道group by后面的字段会组成一个唯一的键,得到的结果是按照这个唯一键值的分组。关于group by具体看一个例子就清楚了。struct Person{string name;int age;string city;};vector vt 阅读全文

posted @ 2013-08-27 21:46 qicosmos(江南) 阅读(5719) 评论(15) 推荐(1) 编辑

(原创)c++11改进我们的程序之垃圾回收
摘要:c#和java中有自动垃圾回收机制,.net运行时和java虚拟机可以管理分配的堆内存,在对象失去引用时自动回收,因此在c#和jva中, 内存管理不是大问题。c++语言没有垃圾回收机制,必须自己去释放分配的堆内存,否则就会内存泄露。 我相信大部分c++开发人员都遇到过内存泄露的问题,而查找内存... 阅读全文

posted @ 2013-08-26 15:50 qicosmos(江南) 阅读(8247) 评论(6) 推荐(4) 编辑

(原创)c++中的类型擦除
摘要:c++11 boost技术交流群:296561497,欢迎大家来交流技术。关于类型擦除,可能很多人都不清楚,不知道类型擦除是干啥的,为什么需要类型擦除。有必要做个说明,类型擦除就是将原有类型消除或者隐藏。为什么要擦除类型?因为很多时候我不关心具体类型是什么或者根本就不需要这个类型,通过类型擦除我们可以获取很多好处,比如使得我们的程序有更好的扩展性、还能消除耦合以及消除一些重复行为,使程序更加简洁高效。归纳一下c++中类型擦除方式主要有如下五种:第一种:通过多态来擦除类型第二种:通过模板来擦除类型第三种:通过某种容器来擦除类型第四种:通过某种通用类型来擦除类型第五种:通过闭包来擦除类型第一种类型 阅读全文

posted @ 2013-08-13 21:07 qicosmos(江南) 阅读(11240) 评论(6) 推荐(5) 编辑

(原创)c++11改进我们的模式之改进代理模式,实现通用的AOP框架
摘要:c++11 boost技术交流群:296561497,欢迎大家来交流技术。本次要讲的时候如何改进代理模式,具体来说是动态代理模式,动态代理模式一般实现AOP框架,不懂AOP的童鞋看这里。我前面的博文也实现了一个AOP框架(可以参考我前面的博文:(原创) C++ 轻量级AOP框架),但是那个AOP框架... 阅读全文

posted @ 2013-06-25 10:09 qicosmos(江南) 阅读(3554) 评论(8) 推荐(2) 编辑

(原创)c++11改进我们的模式之改进表驱动模式
摘要:所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值。表驱动是将一些通过较为复杂逻辑语句来得到数据信息的方式,通过查询表的方式来实现,将数据信息存放在表里。对于消除长的switch-case和if-else-if语句来说很有效,比如下面的代码:string Get... 阅读全文

posted @ 2013-06-20 17:39 qicosmos(江南) 阅读(5276) 评论(0) 推荐(2) 编辑

导航