找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5166|回复: 2

抽丝剥茧,ACE_Message_Block 的尺寸辨析(2)

[复制链接]
发表于 2007-12-26 22:33:23 | 显示全部楼层 |阅读模式
4、total_size()
──────────────────────
  1. size_t
  2. ACE_Message_Block::total_size (void) const
  3. {
  4.   ACE_TRACE ("ACE_Message_Block::total_size");
  5.   size_t size = 0;
  6.   for (const ACE_Message_Block *i = this;
  7.        i != 0;
  8.        i = i->cont ())
  9.     size += i->size ();
  10.   return size;
  11. }
复制代码
这个方法,返回的是内部单链表中的所有消息块的设置尺寸size()之和。
───────────────────────────
5、total_size_and_length()
───────────────────────────
  1. void
  2. ACE_Message_Block::total_size_and_length (size_t &mb_size,
  3.                                           size_t &mb_length) const
  4. {
  5.   ACE_TRACE ("ACE_Message_Block::total_size_and_length");
  6.   for (const ACE_Message_Block *i = this;
  7.        i != 0;
  8.        i = i->cont ())
  9.     {
  10.       mb_size += i->size ();
  11.       mb_length += i->length ();
  12.     }
  13. }
复制代码
这个方法其实是total_size()和total_length()合并调用的结果。
───────────────────────────
6、capacity()
──────────────────────
  1. ACE_INLINE size_t
  2. ACE_Data_Block::capacity (void) const
  3. {
  4.   ACE_TRACE ("ACE_Data_Block::capacity");
  5.   return this->max_size_;
  6. }
复制代码
这个方法返回的是此消息块能够存储数据的最大值
───────────────────────────
7、total_capacity()
───────────────────────────
  1. size_t
  2. ACE_Message_Block::total_capacity (void) const
  3. {
  4.   ACE_TRACE ("ACE_Message_Block::total_capacity");
  5.   size_t size = 0;
  6.   for (const ACE_Message_Block *i = this;
  7.        i != 0;
  8.        i = i->cont ())
  9.     size += i->capacity ();
  10.   return size;
  11. }
复制代码
这个方法返回的是内部单链表中所有消息块的最大存储量之和。
──────────────────────────
8、space()
──────────────────────────
  1. ACE_INLINE size_t
  2. ACE_Message_Block::space (void) const
  3. {
  4.   ACE_TRACE ("ACE_Message_Block::space");
  5.   return this->mark () - this->wr_ptr ();
  6. }
  7. 这个mark是什么呢?
  8. // Return a pointer to 1 past the end of the data buffer.
  9. ACE_INLINE char *
  10. ACE_Data_Block::mark (void) const
  11. {
  12.   ACE_TRACE ("ACE_Data_Block::mark");
  13.   return this->base_ + this->cur_size_;
  14. }
  15. ACE_INLINE char *
  16. ACE_Message_Block::mark (void) const
  17. {
  18.   ACE_TRACE ("ACE_Message_Block::mark");
  19.   return this->data_block ()->mark ();
  20. }
复制代码
这个方法是计算当前消息块,还剩下多少可写空间。
相信做了这些辨析后,写代码应该不会再产生误用了。


Winston原创,ACE开发者论坛版权所有。[url=http://www.acejoy.com/]www.acejoy.com[/url]
 楼主| 发表于 2007-12-26 22:33:45 | 显示全部楼层
补充:

                    rd_ptr,wr_ptr   
                         ||
                         vv
                        +--+--+--+--+--+--+--+--------------+--+--+--+
                        |  |  |  |  |  |  |  |        ..... |  |  |  |
                        +--+--+--+--+--+--+--+--------------+--+--+--+
                         ^                                         ^^
                         |                                         ||
                        base                                    mark,end
                        
                        
ACE_Message_Block::size() == ACE_Data_Block::size() == mark - base
ACE_Message_Block::capacity() == ACE_Data_Block::capacity() == end - base
ACE_Message_Block::length() == wr_ptr - rd_ptr
ACE_Message_Block::space() == mark - wr_ptr
发表于 2010-5-15 14:05:39 | 显示全部楼层
  1. [code][free][/free]
复制代码
[/code]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 17:01 , Processed in 0.016303 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表