使用C++11改造muduo

        上周拿到了订购的《Linux多线程服务端编程:使用muduo C++网络库》一书,花费一天时间浏览了一遍,并细读了其中感兴趣的一些章节。阅毕,决定用C++11改造其相应源码muduo

        muduo依赖boost这个庞大的库,而且还使用cmake才能进行编译,我当时的目标也就只有两个:1 删除muduo代码中boost相关的代码;2 自己添加makefile编译文件,去除与cmake相关的编译代码。

         

         目前已经完成的任务是:

         1 完成了muduo主干目录muduo/base的boost去除,muduo/base/tests下的测试用例【除去依赖zip库的GzipFile_test.cc和依赖boost unit test库的./base/tests/LogStream_test.cc外】全部通过,编译makefile为muduo/base/tests/makefile;

         2 完成了muduo主干目录muduo/net的boost去除,muduo/net/tests下的测试用例【除去依赖boost unit test库的 ./net/http/tests/HttpRequest_unittest.cc 、./net/tests/InetAddress_unittest.cc 、 ./net/tests/Buffer_unittest.cc和./net/tests/ZlibStream_unittest.cc外】全部通过,编译脚本为muduo/net/tests/makefile。

         代码已经上传到github上,如果感兴趣,请猛击 "a muduo branch withoud boost and cmake, just using c++11 and makefile to make 


         改造过程中的主要任务就是去除boost相关的代码,相关的经验总结如下:

         1 把boost::shared_ptr 替换为 std::shared_ptr;

         2 把boost::weak_ptr 替换为 std::weak_ptr;

         3 把boost::scoped_ptr 替换为 std::unique_ptr,但是请注意二者之间的差别,boost::scoped_ptr 有生成范围(scope),离开这个范围它就会死掉,std::unique_ptr如果独立存在,那么它等同于boost::scoped_ptr , 但是如果std::unique_ptr被存放在了别的容器如vector内,它的对象就会与容器永存;

         4 把get_pointer(unique_ptr) 替换为 unique_ptr.get();

         5 把boost::ptr_vector 替换为 std::vector>,之所以这么替换,是依据第3条;

         6 在boost::ptr_vector 替换为 std::vector>时候,boost::ptr_vector::ptr_vector(size)禁止替换为std::vector::vector(size),因为前者是扩容ptr_vector的capacity,而后者则是扩容capacity的同时再构造size个默认对象,相应的代码请参考muduo/base/ests/BlockingQueue_bench.cc和muduo/base/ests/BlockingQueue_test.cc;

         5 把boost::ptr_vector 替换为 std::vector>时,不要把boost::ptr_vector::pop_back直接替换为std::vector::pop_back,因为前者是pop出最后一个对象并返回这个对象,而std::vector::pop_backpop出最后一个对象并返回void,相应的代码请参考muduo/base/AsyncLogging.cc;

         6 把boost::ptr_vector 替换为 std::vector>时, 不要简单的以使用boost::ptr_vector::pop_back方式来使用std::vector::push_back,而是应该把分配对象和push_back放在一行代码完成, 因为这里push的是一个std::unique_ptr对象,而std::unique_ptr不支持拷贝复制,相关的参考点在EventLoopThreadPool.ccmuduo/net/EventLoopThreadPool.cc line45-line50;     

         7 把boost::bind替换为 std::bind,请注意 std::bind只能使用C形式的function和class的static成员函数,相关的参考点在muduo/net/TcpConnection.cc line110 和 line131;

         8 去除boost::any,替之以cdiggins::any,代码文件为muduo/other/any.h;

         9 去除boost::noncopyable,替之以muduo::noncopyable,放在muduo/other/noncopyable.h;


         下一步的收尾工作如下:

         1 把boost unit test修改为gtest;

         2 用muduo/examples下的所有的测试用例做回归测试。

         date:2015/05/20。

你可能感兴趣的:(linux网络)