使用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上,如果感兴趣,请猛击git branch。


         改造过程中的主要任务就是去除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<T> 替换为 std::vector<std::unique_ptr<T>>,之所以这么替换,是依据第3条;

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

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

         6 把boost::ptr_vector<T> 替换为 std::vector<std::unique_ptr<T>>时, 不要简单的以使用boost::ptr_vector<T>::pop_back方式来使用std::vector<T>::push_back,而是应该把分配对象和push_back放在一行代码完成, 因为这里push的是一个std::unique_ptr<T>对象,而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。


你可能感兴趣的:(boost,C++11,cmake,muduo)