找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6198|回复: 3

ACE_Message_Block

[复制链接]
发表于 2010-5-15 19:38:59 | 显示全部楼层 |阅读模式
ace_message_block 是ACE中的一个重要的类,其跟ACE中的众多框架联系在了一起,  eg:ace_task/ace_reactor/ace_proactor etc...
所以对其的认识对学好ACE是关键之一!
其有以下主要特征:
1.ACE_Message_Block内部采用ACE_Data_Block来间接管理实际数据, 减轻了其它功能与实际内存管理之间的耦合.
2.ACE_Message_Block采用了引用计数, 可以灵活高效的共享数据, 并降低了内存拷贝带来的额外开销.实际上, ACE_Message_Block本身并没有reference count, 而是间接的由ACE_Data_Block来提供.
3.内部表现为单链表,外部表现为双链表!!(即所谓的正交互不相干,互不影响)
4.支持复合消息,由CONT()连接;
5.提供双链表形式,为ace_message_queue提供支持。其表现形式为prev().next()...
6.ACE_Message_BlockACE_Data_Block, 除非主动调用size(), 否则它们不会自动申请和扩大空间.




7.ACE_Message_Block的构造函数中,如果dataNULL, ACE_Message_Block会为其自动分配空间. 但如dataNULL,ACE_Message_Block会直接引用data指向的空间, 并不会进行新的空间分配和拷贝.
所以需要特别注意, ACE_Message_Block的实例没有销毁之前,不能释放data指向的空间.


8.虽然ACE_Message_Block会根据size的值来更改自己的size(),wr_ptr不会根据data的长度进行设置, 造成length()的返回为0.
需要特别注意, 当构造一个ACE_Message_Block实例后, 随之需要追加数据时,必须设置wr_ptr的值,否则原有数据将会被覆写.
9.ACE_Message_Block::copy(const char* buf) 函数将字符串copyACE_Message_Block, 如果内在空间不足, 将会返回-1.
需要特别注意, copy的数据将包括末尾的0, 也就是copy的数据长度为strlen(buf)+1.
而且, 会自动进行wr_ptr()的设置.
发表于 2010-5-15 23:21:22 | 显示全部楼层

好,总结帖最喜欢

clone,duplicate特点还没有总结呢,呵呵,这个才是精华呢。
 楼主| 发表于 2010-5-16 09:35:41 | 显示全部楼层
呵呵。。。请各位接着补充。。。
发表于 2010-6-19 18:29:13 | 显示全部楼层
能不能说一下他的那些消息类型是怎么用的,他自定义的消息格式是怎么样的啊?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-23 16:11 , Processed in 0.016639 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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