首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

OpenRTMFP/Cumulus Primer(13)IO治理之局部内存片

2012-09-22 
OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片Author:

OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片

OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片
  • Author: 柳大·Poechant(钟超)
  • Email: zhongchao.ustc#gmail.com (#->@)
  • Blog:?Blog.CSDN.net/Poechant
  • Date: April 24th, 2012

    首先要说的是,该类在 OpenRTMFP/Cumulus 中目前还没有用到 :( 所以您可以关闭您浏览器当前标签,以免浪费时间 :)

    在《OpenRTMFP/Cumulus Primer(10)IO 管理之流缓冲区》一文中介绍的 MemoryStreamBuf 时,其中有一个名为 ScopedMemoryClip 的友元,它就是本文所要介绍的

    首先,最重要的是,ScopedMemoryClip 中有一个 MemoryStreamBuf 成员。

    class ScopedMemoryClip {public:    ScopedMemoryClip(MemoryStreamBuf& buffer,Poco::UInt32 offset);    ~ScopedMemoryClip();private:    void                clip(Poco::Int32 offset);    Poco::UInt32        _offset;    MemoryStreamBuf&   _buffer;};

    1 构造函数

    构造函数传入的参数对应的就是 ScopedMemoryClip 的两个成员值。其中偏移量不能超过 MemoryStremamBuf 的缓冲区上线值。

    ScopedMemoryClip::ScopedMemoryClip(MemoryStreamBuf& buffer, UInt32 offset)    : _offset(offset), _buffer(buffer) {    if (_offset >= _buffer._bufferSize)        _offset = _buffer._bufferSize - 1;    if (_offset < 0)        _offset = 0;    clip(_offset);}

    2 析构函数
    ScopedMemoryClip::~ScopedMemoryClip() {    clip(-(Int32)_offset);}

    3 缓冲区切割

    可以看到构造函数和析构函数中都调用了 clip 函数,该函数切割完缓冲区,形成局部内存片:

    • 如果传入的偏移量参数为正,则仅保留切割之后的后一部分。
    • 如果传入的参数为负,则相当于向前扩充缓冲区。(只发生于析构函数中)

      其源码如下。

      void ScopedMemoryClip::clip(Int32 offset) {    // 获取到 gptr    char* gpos = _buffer.gCurrent();    // 偏移缓冲区地址,并修改缓冲区大小    _buffer._pBuffer += offset;    _buffer._bufferSize -= offset;    // pptr 的位置减去缓冲区新地址,作为 pptr 的新位置    int ppos = _buffer.pCurrent() - _buffer._pBuffer;    // 设置 gptr 可达区域和位置    _buffer.setg(_buffer._pBuffer, gpos, _buffer._pBuffer + _buffer._bufferSize);    // 设置 pptr 可达区域和位置    _buffer.setp(_buffer._pBuffer, _buffer._pBuffer + _buffer._bufferSize);    _buffer.pbump(ppos);    // 如果已写数据数小于偏移量,则可以将已写数据数设置为零    if (_buffer._written < offset)        _buffer._written = 0;    // 如果已写数据数大于等于偏移量,则减去 offset    else        _buffer._written -= offset;    // 若已写字节数大于缓冲区容量,则设定为缓冲区容量    if (_buffer._written > _buffer._bufferSize)        _buffer._written = _buffer._bufferSize;}

      -

      转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant

      -

热点排行