现在的位置: 首页 > 综合 > 正文

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

2013年02月05日 ⁄ 综合 ⁄ 共 1685字 ⁄ 字号 评论关闭


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

-

抱歉!评论已关闭.