ACE内存托管之ACE_Cached_Allocator使用

ACE_Cached_Allocator预先分配内存,然后使用它自己的内部机制来管理内存。这样的分配发生在类的构造器中。所以使用它,仅在开始时使用OS内存分配接口来完成分配。

在那以后,它将照管所有内存分配和释放。


这样做的好处是性能和可预测性。设想一个必须高度可预测的实时系统,通过OS来分配内存将涉及昂贵和不可预测的OS内核调用。而ACE_Cached_Allocator不会涉及这种调用,每一次分配和释放都会花费固定的时间。


#include "ace/Thread_Mutex.h"
#include "ace/Malloc_T.h"


typedef char MEMORY_BLOCK[1024];


typedef ACE_Cached_Allocator<MEMORY_BLOCK,ACE_SYNCH_MUTEX> Allocator;


class MessageManager{


public:
MessageManager(int n_blocks):_allocator(n_blocks),msg_count(0)
{
msg_array = new char*[n_blocks];
}

void allocate_msg(const char *msg)
{
msg_array[msg_count]=(char *)_allocator.malloc(ACE_OS::strlen(msg)+1);
ACE_OS::strcpy(msg_array[msg_count],msg);
msg_count++;
}

void free_all_msg()
{
for(int i=0;i<msg_count;i++)
{
_allocator.free(msg_array[i]);
}
msg_count=0;
}

void display_all_msg()
{
for(int i=0;i<msg_count;i++)
{
ACE_OS::printf("%s\n",msg_array[i]);
}
}


private:
Allocator _allocator;
char **msg_array;
int msg_count;
};
int main(void)
{
int n_blocks = 10;
char *message = new char[50+1];

MessageManager mm(n_blocks);
while(1)
{
for(int i=0;i<n_blocks;i++)
{
ACE_OS::sprintf(message,"Message id:%d\n",i);
mm.allocate_msg(message);
}

ACE_DEBUG((LM_DEBUG,"Displaying the message\n"));
ACE_OS::sleep(2);
mm.display_all_msg();

ACE_DEBUG((LM_DEBUG,"Releasing Message\n"));
ACE_OS::sleep(2);
mm.free_all_msg();
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值