随笔分类 -  C++

boost c++
(原创)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(江南) 阅读(11515) 评论(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(江南) 阅读(9022) 评论(2) 推荐(4) 编辑

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

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

无环的visitor模式
摘要:无环的访问者模式,是来改进原有访问者模式的不足之处的,是Robert C. Martin首次提出的。我们知道访问者模式的优点是为被访问继承体系动态添加行为,而无须改变继承体系。但是GOF访问者模式的缺点是形成了一个循环依赖,强烈的耦合了两个继承体系,使得我们修改任何一方都会对另一方造成影响,所以GOF提出,被访问者的继承体系必须是稳定的,否则,一旦被访问的继承体系修改了,两边都要改。GOF访问者模式的UML类图。从图中可以看到循环依赖,一旦被访者体系发生变化,则访问者体系就要修改,这是难以接受的。 Robert C. Martin提出了一种无环的访问者模式来改进原有的不足,通过改进后,循... 阅读全文

posted @ 2013-10-08 15:30 qicosmos(江南) 阅读(2240) 评论(0) 推荐(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(江南) 阅读(6864) 评论(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(江南) 阅读(2632) 评论(0) 推荐(1) 编辑

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

posted @ 2013-09-12 22:30 qicosmos(江南) 阅读(22309) 评论(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(江南) 阅读(3536) 评论(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(江南) 阅读(9914) 评论(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(江南) 阅读(2437) 评论(4) 推荐(2) 编辑

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

posted @ 2013-08-30 21:14 qicosmos(江南) 阅读(3021) 评论(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(江南) 阅读(5702) 评论(15) 推荐(1) 编辑

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

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

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

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

c++中数据表如何转成业务实体--map和结构体的相互转换
摘要:应用场景:如何把数据库表中的一行转换成一个业务实体结构体,c#和java中都有实体框架,表到实体的转换很方便,c++中缺少这些框架,但是有一些折中的办法去做。其实问题的本质是:map如何转成结构体。问题:map的字段和结构体字段一一对应时,如何把map中字段对应的值付给结构体中相同名称字段?有点麻烦的地方:如何让结构体去在map中查找相应的字段值,一种办法是通过手写的办法,把每个字段名称写成常量字符串,然后去map中查找,找到后,再给该字段赋值,这个办法是可以的,但是重复性的硬编码了很多字段名称,代码也比较丑陋。一个比较好的办法是通过一个宏和一个模板函数去赋值比较好。这是我们的结构体#defi 阅读全文

posted @ 2013-08-09 09:57 qicosmos(江南) 阅读(1876) 评论(0) 推荐(1) 编辑

线程池的陷阱
摘要:使用线程池要小心,一不小心就会导致程序挂死。举例说明这种情况。线程池中有一个同步队列存放数据,多个线程取队列中的数据去处理,数据的类型可能有多个,所以每种数据类型对应一个处理函数,假设某种数据的处理函数会把线程阻死,这时就悲剧了,这个阻死会蔓延到线程池的所有线程,最后线程池中所有的线程都挂死了,程序也挂死了。因为线程池的线程是不停的切换去处理数据的,凡是遇到会挂死线程的数据时,线程会一个个死掉,直到所有的线程挂死。解决办法是:一、一个类型的数据一个线程或者多个类型的数据一个线程,这样某个类型的数据处理导致线程挂死,其它线程还能正常运行,不会导致程序挂死。二、线程池中加超时处理,超时处理就不会挂 阅读全文

posted @ 2013-07-30 14:40 qicosmos(江南) 阅读(1468) 评论(0) 推荐(1) 编辑

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

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

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

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

(原创)c++11改进我们的模式之改进观察者模式
摘要:和单例模式面临的是同样的问题,主题更新的接口难以统一,很难做出一个通用的观察者模式,还是用到可变模板参数解决这个问题,其次还用到了右值引用,避免多余的内存移动。c++11版本的观察者模式支持注册的观察者为函数、函数对象和lamda表达式,也避免了虚函数调用,更简洁更通用。直接看代码。template... 阅读全文

posted @ 2013-06-20 10:51 qicosmos(江南) 阅读(4041) 评论(2) 推荐(0) 编辑

(原创)c++11改进我们的模式之改进访问者模式
摘要:本次讲c++11改进我们的模式之改进访问者模式访问者模式是GOF23个设计模式中比较复杂的模式之一,但是它的功能也很强大,非常适合稳定的继承层次中对象的访问,可以在不修改被访问对象的情况下,动态添加职责,这正是访问者模式强大的地方,但是它的实现又造成了两个继承层次的强烈耦合,这也是被人诟病的地方,可以说是让人爱又让人恨的模式。c++11实现的访问者模式将会解决这个问题。我们将在c++11版本的访问者模式中看到,定义新的访问者是很容易的,扩展性很好,被访问者的继承层次也不用做任何修改。具体代码:templatestruct Visitor;templatestruct Visitor : Vis 阅读全文

posted @ 2013-06-19 22:12 qicosmos(江南) 阅读(2400) 评论(1) 推荐(0) 编辑

导航