|
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_Block和ACE_Data_Block, 除非主动调用size(), 否则它们不会自动申请和扩大空间.
7.ACE_Message_Block的构造函数中,如果data为NULL, 则ACE_Message_Block会为其自动分配空间. 但如data非NULL,则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) 函数将字符串copy到ACE_Message_Block, 如果内在空间不足, 将会返回-1.
需要特别注意, copy的数据将包括末尾的0, 也就是copy的数据长度为strlen(buf)+1.
而且, 会自动进行wr_ptr()的设置. |
|