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;
}