随笔分类 -  C++

boost c++
(原创)c++11中的日期和时间库
摘要:c++11提供了日期时间相关的库chrono,通过chrono相关的库我们可以很方便的处理日期和时间。c++11还提供了字符串的宽窄转换功能,也提供了字符串和数字的相互转换的库。有了这些库提供的便利的工具类,我们能方便的处理日期和时间相关的转换和格式输出。chrono chrono库主要包含了... 阅读全文

posted @ 2014-04-03 12:14 qicosmos(江南) 阅读(36087) 评论(8) 推荐(12) 编辑

(原创)结构体自动化转为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(江南) 阅读(24079) 评论(11) 推荐(7) 编辑

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

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

c++11实现c++14的optional
摘要:c++14中将包含一个std::optional类,它的功能和用法和boost的optional类似。optional内部存储空间可能存储了T类型的值也可能没有存储T类型的值,只有当optional被T初始化之后,这个optional才是有效的,否则是无效的,它实现了未初始化的概念。optional的应用场景函数返回无效对象 有时根据某个条件去查找对象时,如果查找不到对象时就会返回一个无效值,这不表明函数执行失败,而是表明函数正确执行了,但是结果却不是有用的值,这时就可以返回一个未初始化的optional对象出去,在外面判断这个optional对象是否有效对象是否被初始化,如果没有被初始... 阅读全文

posted @ 2014-03-02 22:37 qicosmos(江南) 阅读(12863) 评论(2) 推荐(3) 编辑

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

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

(原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
摘要:boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的。但是在使用过程中却发现各种不好用,归纳一下不好用的地方有这些:获取不存在的节点时就抛出异常获取属性值时,要排除属性和注释... 阅读全文

posted @ 2014-02-19 12:36 qicosmos(江南) 阅读(14255) 评论(1) 推荐(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(江南) 阅读(3884) 评论(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(江南) 阅读(11873) 评论(12) 推荐(12) 编辑

(原创)用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(江南) 阅读(55737) 评论(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(江南) 阅读(6656) 评论(13) 推荐(1) 编辑

c++并行计算库TBB和PPL的基本用法
摘要:并行库充分利用多核的优势,通过并行运算提高程序效率,本文主要介绍c++中两个知名的并行库,一个是intel开发的TBB,一个是微软开发的PPL。本文只介绍其基本的常用用法:并行算法和任务。TBB(Intel® Threading Building Blocks)TBB是intel用标准c++写的一个开源的并行计算库。它的目的是提升数据并行计算的能力,可以在他的官网上下载最新的库和文档。TBB主要功能:并行算法任务调度并行容器同步原语内存分配器TBB并行算法parallel_for:并行方式遍历一个区间。parallel_for(1, 20000, [](int i){cout (0, 阅读全文

posted @ 2014-01-13 11:39 qicosmos(江南) 阅读(35361) 评论(1) 推荐(7) 编辑

一点项目经验的总结
摘要:前几个月开发了一个服务器网关程序,测试过程中发现了一些问题,问题的查找与修改花了一个月的时间。好在经过一个月的修改与完善终于解决了所有问题。现在网关服务器在局域网内吞吐量最高可以达到120MB/S,稳定运行7*24小时,性能和稳定性都让人满意。 然而其中遇到的问题也不少,现在回想起解决过程是痛并快乐着,以此文作一个经验教训的总结。 先说下项目背景,项目要求开发一个高性能的跨平台的网关服务器,主要性能指标是吞吐量达到70-80MB/s,并发连接数要到3000以上。现有的服务器性能达不到要求,最多不过30-40MB/s。这个项目也是我到新部门之后的首秀,也受到领导的高度关注。作为自己的首秀当... 阅读全文

posted @ 2013-12-26 17:25 qicosmos(江南) 阅读(8260) 评论(25) 推荐(11) 编辑

(原创)谈谈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(江南) 阅读(15903) 评论(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(江南) 阅读(5677) 评论(5) 推荐(5) 编辑

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

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

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

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

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

posted @ 2013-11-12 19:21 qicosmos(江南) 阅读(15305) 评论(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(江南) 阅读(10023) 评论(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(江南) 阅读(3025) 评论(1) 推荐(3) 编辑

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

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

导航