文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>ACE_Message_Block类 使用小结(一)

ACE_Message_Block类 使用小结(一)

时间:2010-10-24  来源:ronat

    ACE_Message_Block用来封装"网络主机之间需要传输的数据",并能很好的管理动态内存分配。

 

    ACE_Message_Block对象都包括一个“带有引用计数”的ACE_Data_Block指针成员,该成员指向实际的数据。这种管理数据的方式
可以使实际数据被多个ACE_Message_Block共享

 

    ACE_Message_Block可以被连接成单向链表以形成复合消息;

    

     ACE_Message_Block可以被指针prev_和next_连接成双向链表形成消息队列ACE_Message_Queue, 支持两种类型消息--简单消息和复合消息;

 

    ACE_Message_Block中有多个获取大小或者长度的函数,容易混淆。下图是根据ACE_Message_Block(实际是ACE_Data_Block)

空间的处理状况所绘,能比较清晰的反应出它们的异同。需要注意,为了表现出多样性,下图是wr_ptr(),rd_ptr(),size()都调用过之后的情景。

 

 

 

红色表示是ACE_Message_Block独有的函数, 其余则ACE_Message_Block和ACE_Data_Block均有。

矩形之上函数的返回值均为指针类型,之下的返回值均为size_t类型。

函数

说明

length() 

有效数据的长度== wr_ptr() – rd_ptr()

size()

全部可用空间的长度,如果没有size()而变小,则等同capacity()== mark() – base()

space()

剩余可用空间的长度<= size() - length(),因为不含rd_ptr()移动过的空间== mark() – wr_ptr()

capacity()

最大空间的长度(ACE_Message_Block构造或初始化时所用参数值)== end() – base()

total_length()

复合消息(ACE_Message_Block内单向链 cont())的总长度

total_size()

复合消息(ACE_Message_Block内单向链 cont())的总大小

total_capacity()

复合消息(ACE_Message_Block内单向链 cont())的总空间大小

duplicate()浅拷贝函数,公用一个内部的ACE_Data_Block
ACE_Message_Block::duplicate() 与 ACE_Data_Block::duplicate()的实现是不同的。
ACE_Data_Block::duplicate()简单的只是将自身的reference加+1, 然后返回自身(this)。
ACE_Message_Block::duplicate()则将自身copy了一份, 然后将自身的状态值赋给拷贝,注意它们公用同一个data_block。
而且ACE_Message_Block::duplicate()支持复合消息,它会检查内部单向链,来依次调用其duplicate()。
ACE_Message_Block::clone()深拷贝, 不但拷贝自身,内部的ACE_Data_Block也一并拷贝了,并且支持复合消息。

ACE_Data_Block::size(size_t len)函数, 动态的变化ACE_Data_Block持有的空间。
ACE_Message_Block::size(size_t len)函数是ACE_Data_Block::size(size_t len)的简单包裹。
如果len比现有的尺寸小, 简单的cur_size_ = length;
如果len比现有的尺寸大, 会申请新的空间并拷贝原所有数据。

注意! 这里可能会发生空间控制权的转换! 即标志位DONT_DELETE的变化。若原ACE_Data_Block使用托管空间,
则此时会更替为自己申请的空间,从而拥有了控制权, 所以此时要注意原有空间的管理。对ACE_Message_Block和ACE_Data_Block,
除非主动调用size(), 否则它们不会自动申请和扩大空间。


ACE_Message_Block::crunch() 将现有数据移动到现有的缓冲的开始。
ACE_Message_Block::reset()  将现有读写指针赋为初始值(ACE_Data_Block::base())
ACE_Message_Block::base()   是对ACE_Data_Block::base()的简单包裹 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载