ACE_Message_Block在Ace中用来表示消息的存放空间,可用做网络通信中的消息缓冲区,使用非常频繁,下面将在如下方简单的介绍一下ACE_Message_Block相关功能。

  1. 创建消息块
  2. 释放消息块
  3. 从消息块中读写数据
  4. 数据的拷贝
  5. 其它常用函数

1。创建消息块

创建消息块的方式比较灵活,常用的有以下几种方式 :

1。直接给消息块分配内存空间创建。

ACE_Message_Block *mb = new ACE_Message_Block (30);

2。共享底层数据块创建。

char buffer[100];
    ACE_Message_Block *mb = new ACE_Message_Block (buffer,30);

这种方式共享底层的数据块,被创建的消息块并不拷贝该数据,也不假定自己拥有它的所有权。在消息块mb被销毁时,相关联的数据缓冲区data将不会被销毁。这是有意义的:消息块没有拷贝数据,因此内存也不是它分配的,这样它也不应该负责销毁它。

3。通过duplicate()函数从已有的消息块中创建副本。

ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_Message_Block *mb2 = mb->duplicate();

这种方式下,mb2和mb共享同一数据空间,使用的是ACE_Message_Block的引用计数机制。它返回指向要被复制的消息块的指针,并在内部增加内部引用计数。

4。通过clone()函数从已有的消息块中复制。

ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_Message_Block *mb2 = mb->clone();

clone()方法实际地创建整个消息块的新副本,包括它的数据块和附加部分;也就是说,这是一次"深拷贝"。

2。释放消息块

一旦使用完消息块,程序员可以调用它的release()方法来释放它。

  1. 如果消息数据内存是由该消息块分配的,调用release()方法就也会释放此内存。
  2. 如果消息块是引用计数的,release()就会减少计数,直到到达0为止;之后消息块和与它相关联的数据块才从内存中被移除。
  3. 如果消息块是通过共享已分配的底层数据块创建的,底层数据块不会被释放。

无论消息块是哪种方式创建的,只要在使用完后及时调用release()函数,就能确保相应的内存能正确的释放。

3。从消息块中读写数据

ACE_Message_Block提供了两个指针函数以供程序员进行读写操作,rd_ptr()指向可读的数据块地址,wr_ptr()指向可写的数据块地址,默认情况下都执行数据块的首地址。下面的例子简单了演示它的使用方法。

#include "ace/Message_Queue.h"
#include "ace/OS.h"

int main(int argc, char *argv[])
{
    ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");
    ACE_OS::printf("%s\n",mb->rd_ptr ());
    mb->release();
    return 0;
}

注意:这两个指针所指向的位置并不会自动移动,在上面的例子中,函数执行完毕后,执行的位置仍然是最开始的0,而不是最新的可写位置5,程序员需要通过wr_ptr(5)函数手动移动写指针的位置。

4。数据的拷贝

一般的数据的拷贝可以通过函数来实现数据的拷贝,copy()还会保证wr_ptr()的更新,使其指向缓冲区的新末尾处。

下面的例子演示了copy()函数的用法。

mb->copy("hello");
    mb->copy("123",4);

注意:由于c++是以'\0'作为字符串结束标志的,对于上面的例子,底层数据块中保存的是"hello\0123\0",而用ACE_OS::printf("%s\n",mb->rd_ptr ());打印出来的结果是"hello",使用copy函数进行字符串连接的时候需要注意。

5。其它常用函数

  1. length()    返回当前的数据长度
  2. next()    获取和设置下一个ACE_Message_Block的链接。(用来建立消息队列非常有用)
  3. space()    获取剩余可用空间大小
  4. size()    获取和设置数据存储空间大小。

小结:

ACE_Message_Block功能简介相关推荐

  1. autoware框架与功能简介(一)

    autoware框架与功能简介(一) Autoware.AI是世界上第一个用于自动驾驶技术的"All-in-One"开源软件.它ROS1操作系统,并在Apache2.0许可下使用. ...

  2. 【Android 逆向】代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 )

    文章目录 一.代码调试器功能简介 二.Attach 进程 一.代码调试器功能简介 代码调试器功能 : 设置断点 : 无论什么类型的调试器 , 都必须可以设置断点 , 运行到断点处 , 挂起被调试进程 ...

  3. Arduino终于支持代码补全了!小白们终于可以愉快的写代码了!Arduino IDE 2.0beta功能简介...

    Arduino终于支持代码补全了!小白们终于可以愉快的写代码了!Arduino IDE 2.0beta功能简介 前一段时间听到有人说Arduino的IDE特别不好用,功能太单一,最重要的是没有代码补全 ...

  4. RTOS原理及功能简介

    文章目录 1 RTOS原理及功能简介 1.1 RTOS概述 1.2 RTOS工作原理简介 1.3 RTOS如何解决前后台代码结构存在的问题 1 RTOS原理及功能简介 1.1 RTOS概述 百度百科的 ...

  5. html台风路径,常用气象网站功能简介

    常用气象网站部分功能简介 主要对如下网站进行介绍: 主要介绍常用气象网站的查询功能,以及信息提示 南汇气象局气象服务网站http://www.doczj.com/doc/16ee71ebf8c75fb ...

  6. MKL学习——功能简介

    基本术语 BLAS : Basic Linear Algebra Subprograms 基本线性代数子程序 BLACS : Basic Linear Algebra Communication Su ...

  7. 商场楼层导视牌图片_百宝图商场电子导视软件中预约产品功能简介

    百宝图商场电子导视软件中预约产品功能简介 管理端,可配合百宝图商场电子导视软件配套使用 1:数据展示:图形展示总预约数/预约时间峰值/预约途径/各途径数量对比 2:数据统计:有效预约数量/无效预约数量 ...

  8. Hadoop生态圈-Ambari控制台功能简介

    Hadoop生态圈-Ambari控制台功能简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在经历一系列安装过程之后(部署过HDP后我终于发现为什么大家喜欢用它了,部署比CDH简 ...

  9. uc浏览器TV版最新版本功能简介

    uc浏览器TV版最新版本功能简介 UC浏览器TV版怎么样?提起UC很多人都知道,不就是那款在手机上很火的浏览器么?而要说到UC电视版,知道的人就不多了.本月初,UC发布了旗下首款PC版浏览器,网友们试 ...

最新文章

  1. python保存list
  2. pod install 失败 Сocoapods trunk URL couldn't be downloaded
  3. C++ string类的方法
  4. docker 与tomcat整合
  5. 拦截请求并记录相应信息-springboot
  6. 八种基本排序方式(插入排序,希尔排序,选择排序,冒泡排序,快速排序,堆排序,归并排序,基数排序)代码模板以及时间复杂度
  7. java redis rpush_Redis Rpush 命令
  8. What is the difference between a domain and web hosting? (域名和虚拟主机)
  9. 伺服驱动器cn1引脚定义_英威腾伺服
  10. java gui变量_关于java:静态/类变量和GUI
  11. 新手学JavaScript都要学什么?
  12. 基于Sendmail、Dovecot和Ssl的电子邮件服务器搭建——从不安全通信到安全通信
  13. 转载:解决微信OAuth2.0网页授权回调域名只能设置一个的问题
  14. 2019百度之星初赛第五题
  15. 穿越时空的爱恋-Z80 CPU的前世今生
  16. Tableau Desktop 2020 Mac支持M1芯片下载big sur 解决M1芯片安装Tableau Public教程2021
  17. 福禄克DTX-1800其配件DTX-CHA002通道适配器CHANNEL更换RJ45插座小记
  18. c语言程序设计教程+西安交通大学,大学C程序设计教程-西安交通大学.ppt
  19. EF系列(二)——DbContext 和DbSet
  20. html5待办事项模板,使用HTML5本地存储实现的待办事项列表

热门文章

  1. 初识Vue,写的一些小练习
  2. 虚幻填坑004:减少starter content占用空间,只保留使用的assets
  3. 学习JavaScript 的必备
  4. 如何通过cpuinfo信息查看几个物理cpu,几个核数,几线程
  5. 不聋不哑,不做当家之解
  6. 磁头号和起始扇区的计算方法------软盘结构
  7. 保护模式下寻址(易懂)
  8. 快速理解Docker - 容器级虚拟化解决方案
  9. linux无锁化编程
  10. 什么是逻辑分析仪?逻辑分析仪的参数、使用步骤和优势