随笔分类 -  C++11工程实践

c++11实战
我的开源项目和部分技术文章索引
摘要:我的书《深入应用C++11--代码优化与工程级应用》 我在github上的开源项目 高性能易用的http server cinara 高性能易用的c++ web开发框架feather 高性能易用的RPC框架REST_RPC 基于编译期反射的序列化引擎 基于编译期反射的ORM引擎高性能易用的http 阅读全文

posted @ 2015-08-31 10:46 qicosmos(江南) 阅读(8147) 评论(3) 推荐(4) 编辑

CINATRA发布第一个版本
摘要:cinatra是什么?cinatra是C++开源社区–purecpp发起的一个开源项目,现在正式发布第一个版本cinatra0.9.0,cinatra是一个现代C++写的webframework,它的目的是给用户提供一个易用、灵活和高性能的web框架,让用户能完全专注于核心逻辑而无需关注http细节... 阅读全文

posted @ 2015-08-06 14:38 qicosmos(江南) 阅读(4542) 评论(1) 推荐(1) 编辑

一个更好的C++序列化/反序列化库Kapok
摘要:KapokFAQ1.Kapok的特点简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack相当。它是纯c++11实现,因此需要支持C++11的编译器。2.主要功能对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个t... 阅读全文

posted @ 2015-05-08 11:57 qicosmos(江南) 阅读(11630) 评论(27) 推荐(2) 编辑

泛化之美--C++11可变模版参数的妙用
摘要:1概述<!--?xml:namespace prefix = "o" ns = "urn:schemas-microsoft-com:office:office" /--> C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高 阅读全文

posted @ 2015-03-10 14:30 qicosmos(江南) 阅读(141398) 评论(24) 推荐(39) 编辑

play with variadic template
摘要:我曾在公司内部的一次技术培训课程中讲到如何展开可变模板参数的问题,具体来说是如何打印可变模板参数,我初略数了一下,有很多种,下面来看看到底有多少种不同的方法展开可变模板参数吧。 写法1很普通,没什么特别的,算是中规中矩,也是一般情况下的展开方式,下面来看特殊一点的展开方式: 写法2比较巧妙,借助初始 阅读全文

posted @ 2015-03-02 21:54 qicosmos(江南) 阅读(2092) 评论(2) 推荐(0) 编辑

(原创)sqlite封装库SmartDB1.3发布
摘要:最近终于稍微有点空对SmartDB进行升级了,SmartDB1.3比之前的版本做了简化,增强了易用性和灵活性。 SmartDB对sqlite做了一层封装,屏蔽了诸多细节,使得我们使用起来很方便。在注重易用性的基础上还兼顾了性能和灵活性。易用性接口很简单,基本接口有如下几个:void Open(... 阅读全文

posted @ 2014-06-23 23:01 qicosmos(江南) 阅读(4865) 评论(11) 推荐(10) 编辑

std::bind技术内幕
摘要:引子 最近群里比较热闹,大家都在山寨c++11的std::bind,三位童孩分别实现了自己的bind,代码分别在这里:木头云的实现mr.li的实现null的实现,null的另一个版本的实现 这些实现思路和ms stl的std::bind的实现思路是差不多的,只是在实现的细节上有些不同。个人觉得木... 阅读全文

posted @ 2014-05-12 14:45 qicosmos(江南) 阅读(13868) 评论(1) 推荐(11) 编辑

(原创)结构体自动化转为char数组的实现
摘要:结构体自动化转换为char数组这个需求,来自于一个最近开发的一个项目,在项目开发过程中遇到一个小问题,需要将各种结构体拷贝到char数组中,这对于一个简单的结构体来说是很简单的事情,比如下面这个只有整形字段的结构体:struct A{ int a; int b;};char buf[100];A a = {1,2};memcpy(buf, &a, sizeof(A)); 一句memcpy就能将结构体a拷贝到char数组中去了,直接通过memcpy拷贝结构体只对于内存连续的结构体有效。如果结构体内存不连续,结构体中含有double、string、指针甚至嵌套结构体时,直接拷贝是... 阅读全文

posted @ 2014-03-15 10:44 qicosmos(江南) 阅读(24349) 评论(11) 推荐(9) 编辑

(原创)一个轻量级、高性能的消息分发器的实现
摘要:一个消息分发器应该要具备以下几个特征:集中注册消息以及消息处理函数;可以处理任何类型的消息;根据消息选择正确的消息处理函数;能检测消息的正确性; 要实现一个消息分发器的难点在如何能处理所有的消息,因为不同的消息的消息处理函数是不同的,有可能不同的消息处理函数的返回值、形参都不同,目前还没有一种容器能将所有的函数,诸如 void f(); void f1(int); int f2(double); double f3(int, double)等函数放到一个容器中。如果真的存在这种容器的话,那就可以将消息和消息函数作为一个pair存放到这个容器中,分发消息的时候就可以根据消息选择对应的消息处理函. 阅读全文

posted @ 2014-03-07 12:04 qicosmos(江南) 阅读(7182) 评论(12) 推荐(6) 编辑

(原创)用c++11打造好用的variant(更新)
摘要:关于variant的实现参考我前面的博文,不过这第一个版本还不够完善,主要有这几个问题:内部的缓冲区是原始的char[],没有考虑内存对齐;没有visit功能。没有考虑赋值构造函数的问题,存在隐患。 这次将解决以上问题,还将进一步增强variant的功能。增加的功能有:通过索引位置获取类型。通... 阅读全文

posted @ 2014-02-21 14:44 qicosmos(江南) 阅读(12563) 评论(2) 推荐(4) 编辑

(原创)用c++11打造类似于python的range
摘要:python中的range函数表示一个连续的有序序列,range使用起来很方便,因为在定义时就隐含了初始化过程,因为只需要给begin()和end()或者仅仅一个end(),就能表示一个连续的序列。还可以指定序列产生的步长,如range(0,10,8)产生的序列为[0, 8], 默认的步长为1,... 阅读全文

posted @ 2014-02-08 14:35 qicosmos(江南) 阅读(3903) 评论(1) 推荐(4) 编辑

(原创)发布一个c++11开发的轻量级的并行Task库TaskCpp
摘要:TaskCpp简介 TaskCpp是c++11开发的一个跨平台的并行task库,它的设计思路来源于微软的并行计算库ppl和intel的并行计算库tbb,关于ppl和tbb我在前面有介绍。既然已经有了这两个大公司开发的并行计算库,我为什么还要开发自己的并行计算库。有两个原因:ppl只能在window... 阅读全文

posted @ 2014-01-27 16:04 qicosmos(江南) 阅读(12006) 评论(12) 推荐(12) 编辑

(原创)谈谈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(江南) 阅读(16095) 评论(10) 推荐(6) 编辑

(原创)如何使用boost.asio写一个简单的通信程序(二)
摘要:先说下上一篇文章中提到的保持io_service::run不退出的简单办法。因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了,如何让异步事件队列中一直有事件呢?一个简单的办法就是循环发起异步读操作,如果对方一直都不发数据过来,则这个异步读事件就会一直在异步事件队列中,这样io_service::run就不会退出了。但是这样有一个缺点就是io_service::run处于阻塞会阻塞当前线程,如果不希望阻塞当前线程,就还是通过work来保持io_service::run不退出。 现在言归正传,看看如何用asio写一个简... 阅读全文

posted @ 2013-12-12 15:59 qicosmos(江南) 阅读(5703) 评论(5) 推荐(5) 编辑

(原创)如何使用boost.asio写一个简单的通信程序(一)
摘要:boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介绍如何写一个简单的通信程序来告诉读者如何使用asio,希望对asio的初学者有所帮助。由于只是介绍其基本用法,作为例子的简单示例并不考虑很多的业务逻辑和异常处理,只是介绍基本用法,让初学者入门。 使用asio容易出错的一个主要原因是因为它是基于proactor模式实现的,asio有很多异步操作接口,这些异步接口稍不注意就会出现莫名奇妙的错误,所以要用好asio的第一步是理解其异步操思想。异步... 阅读全文

posted @ 2013-12-06 11:45 qicosmos(江南) 阅读(11811) 评论(5) 推荐(9) 编辑

(原创)用c++11实现简洁的ScopeGuard
摘要:ScopeGuard的作用是确保资源面对异常时总能被成功释放,就算没有正常返回。惯用法让我们在构造函数里获取资源,当因为异常或者正常作用域结束,那么在析构函数里释放资源。总是能释放资源。如果没有异常抛出则正常结束,只是有异常发生或者没有正常退出时释放资源。关于ScopeGaurd的概念想多了解一... 阅读全文

posted @ 2013-11-13 14:20 qicosmos(江南) 阅读(5682) 评论(7) 推荐(0) 编辑

(原创)用c++11打造好用的any
摘要:上一篇博文用c++11实现了variant,有童鞋说何不把any也实现一把,我正有此意,它的兄弟variant已经实现了,any也顺便打包实现了吧。其实boost.any已经挺好了,就是转换异常时,看不到详情,和boost.variant一样的问题。实现any比实现variant要简单,需要解决... 阅读全文

posted @ 2013-11-12 19:21 qicosmos(江南) 阅读(15500) 评论(1) 推荐(1) 编辑

(原创)用c++11打造好用的variant
摘要:variant类似于union,它能代表定义的多种类型,允许将不同类型的值赋给它。它的具体类型是在初始化赋值时确定。boost中的variant的基本用法:typedef variant vt;vt v = 1;v = '2';v = 12.32; 用variant一个好处是可以擦除类型,不同类型的值都统一成一个variant,虽然这个variant只能存放已定义的类型,但这在很多时候已经够用了。 取值的时候,通过get(v)来获取真实值。然而,当T类型与v的类型不匹配时,会抛出一个bad_cast的异常来。boost的variant抛出的异常往往没有更多的信息,不知道到底是哪 阅读全文

posted @ 2013-11-10 10:47 qicosmos(江南) 阅读(10156) 评论(3) 推荐(1) 编辑

(原创)一个和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(江南) 阅读(3036) 评论(1) 推荐(3) 编辑

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

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

导航