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()的简单包裹