浮萍晓生的开发日志

记录学习的旅程,把握可预见的未来

导航

文章分类 -  C++ STL/Boost

摘要:最近开始学习内存池技术,《高质量c++/c编程指南》在内存管理的第一句话就是:欢迎进入内存这片雷区,由此可见掌握内存管理对于c++/c程序员的重要性。使用内存池的优点有:降低动态申请内存的次数,提升系统性能,减少内存碎片,增加内存空间使用率。 内存池的分类: 一、不定长内存池:优点:不需要为不同的数据创建不同的内存池,缺点是分配出去的内存池不能回收到池中(?)。代表有apr_pool,obstack。 二、定长内存池:优点:使用完立即把内存归还池中。代表有Loki, Boost。 本次以sgi stl中实现的内存池作为学习对象。由于要实现的是一个C语言的内存池,所以这里用C的描述方式。喜欢C+ 阅读全文

posted @ 2014-03-20 13:21 浮萍晓生 阅读(495) 评论(0) 推荐(0)

摘要:内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术。内存池分类:1、不定长内存池。典型的实现有apr_pool、obstack。优点是不需要为不同的数据类型创建不同的内存池,缺点是造成分配出的内存不能回收到池中。这是由于这种方案以session为粒度,以业务处理的层次性为设计基础。2、定长内存池。典型的实现有LOKI、BOOST。特点是为不同类型的数据结构分别创建内存池,需要内存的时候从相应的内存池中申请内存,优点是可以在使用完毕立即把内存归还池中,可以更为细粒度的控制内存块。 阅读全文

posted @ 2014-03-20 13:18 浮萍晓生 阅读(420) 评论(0) 推荐(0)

摘要:内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术。内存池分类:1、不定长内存池。典型的实现有apr_pool、obstack。优点是不需要为不同的数据类型创建不同的内存池,缺点是造成分配出的内存不能回收到池中。这是由于这种方案以session为粒度,以业务处理的层次性为设计基础。2、定长内存池。典型的实现有LOKI、BOOST。特点是为不同类型的数据结构分别创建内存池,需要内存的时候从相应的内存池中申请内存,优点是可以在使用完毕立即把内存归还池中,可以更为细粒度的控制内存块。 阅读全文

posted @ 2014-03-20 13:14 浮萍晓生 阅读(1742) 评论(0) 推荐(0)

摘要:boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限。顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法:#include#include#includeclassimplementation{public:~implementation() { std::cout sp1(newimplementation());std::cout sp2 = sp1;std::cout(newimplementation()),g());}正确的用法. 阅读全文

posted @ 2014-03-20 13:07 浮萍晓生 阅读(114) 评论(0) 推荐(0)

摘要:boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用:#include#include#includeclassimplementation{public:~implementation() { std::cout impl(newimplementation());impl->do_something();}voidmain(){std::coutclassscoped_ptr : noncopyable {public:explicitscoped_ptr(T* p = 0 阅读全文

posted @ 2014-03-20 13:06 浮萍晓生 阅读(125) 评论(0) 推荐(0)

摘要:循环引用:引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下:#include#include#include#includeclassparent;classchildren;typedefboost::shared_ptr parent_ptr;typedefboost::shared_ptr children_ptr;classparent{public:~parent() { std::cout children = son;son->parent = father;}voidmain(){std::cout是boost提供的 阅读全文

posted @ 2014-03-20 13:05 浮萍晓生 阅读(102) 评论(0) 推荐(0)

摘要:Boost库是一个可移植的开源C++函数库,鉴于STL(标准模板库)已经成为C++语言的一个组成部分,可以毫不夸张的说,Boost是目前影响最大的通用C++库。Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容,是一个“准”标准库。 Boost内存池,即boost.pool库,是由Boost提供的一个用于内存池管理的开源C++库。作为Boost中影响较大的一个库,Pool已经被广泛使用。 1.什么是内存池 “池”是在计算机技术中经常使用的一种设计模式,其内涵在于:将程序中需要经常使用的核心资源先申请出来,放到一个池内,由程序自己管理,这样可以提... 阅读全文

posted @ 2014-03-20 11:46 浮萍晓生 阅读(500) 评论(0) 推荐(0)

摘要:如果只要编译Regex库,有两种方法(参考链接):在Boost根目录下运行bjam--toolset=--with-regex其它参数到\libs egex\build里,找到对应编译器的makefile,然后make-f xxxx.mak使用Boost.Regex手里有七种武器和两****宝其中的七种武器是:regex_match 函数regex_search 函数regex_replace 函数regex_format 函数regex_grep 函数regex_split 函数RegEx 类每种武器都又有诸多变化(每个函数都分别以C字符串类型、std::string类型、迭代器类型作为参数 阅读全文

posted @ 2014-03-20 10:44 浮萍晓生 阅读(2461) 评论(0) 推荐(0)

摘要:Map概述Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,很明显学号用int描述,姓名用字符串描述(本篇文章 阅读全文

posted @ 2014-03-19 16:13 浮萍晓生 阅读(138) 评论(0) 推荐(0)

摘要:正如《STL源码剖析》所讲,“源码之前,了无秘密”。本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。shared_ptr的线程安全性boost官方文档对shared_ptr线程安全性的正式表述是:shared_ptr对象提供与内置类型相同级别的线程安全性。【shared_ptrobjects offer the same level of thread safety as built-in types.】具体是以下三点。1. 同一个sha 阅读全文

posted @ 2014-03-06 16:42 浮萍晓生 阅读(701) 评论(0) 推荐(0)

摘要:boost_asio/example/allocation/server.cpp这个sample演示的是如何自定义handler的分配/释放。asio中大量使用了handler,几乎所有异步函数中都带handler参数,例如io_service::post,async_read_some等等。在调用这些函数时,asio会分配一块内存拷贝保存这个handler,以便在异步完成时调用这个handler。一般的socket程序都会有很多次异步过程,例如循环调用async_read/write等等,这将导致频繁的分配释放小内存(一般情况下,handler的大小不会超过128 bytes,里面只有几个参 阅读全文

posted @ 2014-02-28 15:41 浮萍晓生 阅读(783) 评论(0) 推荐(0)

摘要:1. asio::buffer常用的构造方法asio::buffer有多种的构造方法,而且buffer大小是自动管理的1.1 字符数组char d1[128]; size_t bytes_transferred = socket.receive(boost::asio::buffer(d1)); 1.2 字符向量std::vector d2(128); size_t bytes_transferred = socket.receive(boost::asio::buffer(d2)); 1.3 boost的数组boost::array d3; size_t bytes_transfer... 阅读全文

posted @ 2014-02-27 16:14 浮萍晓生 阅读(5373) 评论(0) 推荐(0)

摘要:deadline_timer和socket一样,都用io_service作为构造函数的参数。也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联。这同样意味着在析构 io_service之前,必须析构关联在这个io_service上的deadline_timer。1. 构造函数在构造deadline_timer时指定时间。basic_deadline_timer( boost::asio::io_service & io_service); basic_deadline_timer( boost::asio::io_service & io_... 阅读全文

posted @ 2014-02-27 16:02 浮萍晓生 阅读(980) 评论(0) 推荐(0)

摘要:无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE。使用io_service作为处理工作的work pool,可以看到,就是通过io_service.post投递一个Handler到io_service的队列,Handler在这个io_service.run内部得到执行,有可能你会发现,io_services.dispatch的接口也和io_service.post一样,但不同的是它是直接调用而不是经过push到队列然后在io_services.run中执行,而在这个示例当中,显然我们需要把工作交到另一个线程 阅读全文

posted @ 2014-02-27 15:07 浮萍晓生 阅读(363) 评论(0) 推荐(0)

摘要:io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁。void test_asio_nowork(){ boost::asio::io_service ios; PRINT_DEBUG("ios before"); ios.run(); PRINT_DEBUG("ios end");}void test_asio_work(){ boost::asio::io_service ios; // 增加一个work对象 boost::asio::io_service::work work. 阅读全文

posted @ 2014-02-27 14:43 浮萍晓生 阅读(465) 评论(0) 推荐(0)

摘要:shared_from_this()在一个类中需要传递类对象本身shared_ptr的地方使用shared_from_this函数来获得指向自身的shared_ptr,它是enable_shared_from_this的成员函数,返回shared_ptr。首先需要注意的是:这个函数仅在shared_ptr的构造函数被调用之后才能使用。原因是enable_shared_from_this::weak_ptr并不在enable_shared_from_this构造函数中设置,而是在shared_ptr的构造函数中设置。a) 如下代码是错误的:class D:public boost::enable 阅读全文

posted @ 2014-02-27 12:00 浮萍晓生 阅读(202) 评论(0) 推荐(0)

摘要:io_service的作用io_servie实现了一个任务队列,这里的任务就是void(void)的函数。Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用。Io_service是完全线程安全的队列。Io_servie的接口提供的接口有run、run_one、poll、poll_one、stop、reset、dispatch、post,最常用的是run、post、stopIo_servie实现代码的基本类结构:Io_servie是接口类,为实现跨平台,采用了策略模式,所有接口均有impl_ 阅读全文

posted @ 2014-02-26 18:05 浮萍晓生 阅读(188) 评论(0) 推荐(0)

摘要:boost::asio 在创建io_service时,可以指定线程数,如果没有指定,默认是一个线程,也就是io_service run的那个线程,如果没有任务运行,该线程会退出。 如果在创建的时候指定了线程数,那么io_service在执行的时候线程数就可以并发执行,如果你run的线程还是只有1个,那么io_service想多线程执行也没有条件,asio在内部是没有创建多线程的,所以这个时候需要你来手动创建多个线程执行io_service的run操作,这样才可以提高效率。顺便说下,worker辅助类可以保证ioservice一直run下去,直到调用stop,才会退出,这个是个很不错的用法... 阅读全文

posted @ 2014-02-26 14:31 浮萍晓生 阅读(507) 评论(0) 推荐(0)

摘要:namespace{ // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. // io_service不能保证线程安全 boost::asio::io_service m_service; boost::asio::strand m_strand(m_service); boost::mutex m_mutex; void print(int id) { // boost::mutex::scoped_lock lock(m_mutex); static int... 阅读全文

posted @ 2014-02-25 10:46 浮萍晓生 阅读(217) 评论(0) 推荐(0)

摘要:这里展示不用boost::asio::strand而是利用常规线程同步的手段来完成线程的同步。#include #include #include #include #include #include classprinter{public:printer(boost::asio::io_service&io):timer1_(io,boost::posix_time::seconds(1)),timer2_(io,boost::posix_time::seconds(1)),count_(0){timer1_.async_wait(boost::bind(&printer:: 阅读全文

posted @ 2014-02-25 10:35 浮萍晓生 阅读(1625) 评论(0) 推荐(0)