找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3270|回复: 0

ACE源码示例 -- Memory Management

[复制链接]
发表于 2008-4-29 10:00:32 | 显示全部楼层 |阅读模式
作者:hxh(贺星河) ACE构架含有一组非常丰富的内存管理类。这些类使得你能够很容易和有效地管理动态内存(从堆中申请的内存)和共享内存(在进程间共享的内存)。你可以使用若干不同的方案来管理内存。你需要决定何种方案最适合你正在开发的应用,然后采用恰当的ACE类来实现此方案。
  ACE含有两组不同的类用于内存管理。
  第一组是那些基于ACE_Allocator的类。这组类使用动态绑定和策略模式来提供灵活性和可扩展性。它们只能用于局部的动态内存分配。
  第二组类基于ACE_Malloc模板类。这组类使用C++模板和外部多态性 (External Polymorphism)来为内存分配机制提供灵活性。在这组类中的类不仅包括了用于局部动态内存管理的类,也包括了管理进程间共享内存的类。这些共享内存类使用底层OS(OS)共享内存接口。
  为什么使用一组类而不是另外一组呢?这是由在性能和灵活性之间所作的权衡决定的。因为实际的分配器对象可以在运行时改变,ACE_Allocator类更为灵活。这是通过动态绑定(这在C++里需要使用虚函数)来完成的,因此,这样的灵活性并非不需要代价。虚函数调用带来的间接性使得这一方案成了更为昂贵的选择。
  另一方面,ACE_Malloc类有着更好的性能。在编译时,malloc类通过它将要使用的内存分配器进行配置。这样的编译时配置被称为“外部多态性”。基于ACE_Malloc的分配器不能在运行时进行配置。尽管ACE_Malloc效率更高,它不像ACE_Allocator那样灵活。
以下示例是在《 ACE programmers guide》中已经发布过的. 这些代码都是出自Hughes Network Systems. 如有疑问可以发邮件给 Umar Syyid <[email=usyyid@hns.com]usyyid@hns.com>[/email] ,或者与我交流hxhforwork@hotmail.com:)
  1. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. //// This example is from the ACE Programmers Guide.
  3. ////  Chapter:  "Memory Management"
  4. //// For details please see the guide at
  5. //// http://www.cs.wustl.edu/~schmidt/ACE.html
  6. ////  AUTHOR: Umar Syyid (usyyid@hns.com)
  7. //// and Ambreen Ilyas (ambreen@bitsmart.com)
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. //Example 1
  10. #include "ace/Malloc.h"
  11. //A chunk of size 1K is created
  12. typedef char MEMORY_BLOCK[1024];
  13.   
  14.    
  15. //Create an ACE_Cached_Allocator which is passed in the type of the
  16. //chunk  that it must pre-allocate and assign on the free
  17. //list
  18. typedef ACE_Cached_Allocator<MEMORY_BLOCK,ACE_SYNCH_MUTEX> Allocator;
  19.   
  20. class MessageManager{
  21. public:
  22. //The constructor is passed the number of chunks that the allocator should pre-allocate //and maintain on its free list.
  23. MessageManager(int n_blocks):
  24. allocator_(n_blocks),message_count_(0){}
  25. //Allocate memory for a message using the Allocator
  26. void allocate_msg(const char *msg){
  27. mesg_array_[message_count_]=
  28.     (char*)allocator_.malloc(ACE_OS::strlen(msg));
  29. ACE_OS::strcpy(mesg_array_[message_count_],msg);
  30. message_count_++;
  31. }
  32. //Free all memory allocated. This will cause the chunks to be returned
  33. //to the allocators internal free list and NOT to the OS.
  34. void free_all_msg(){
  35. for(int i=0;i<message_count_;i++)
  36.   allocator_.free(mesg_array_[i]);
  37. message_count_=0;
  38. }
  39. void display_all_msg(){
  40. for(int i=0;i<message_count_;i++)
  41.   ACE_OS::printf("%s\n",mesg_array_[i]);
  42. }
  43.   
  44. private:
  45. char *mesg_array_[20];
  46. Allocator allocator_;
  47. int message_count_;
  48. };
  49.    
  50. int main(int argc, char* argv[]){
  51. if(argc<2){
  52. ACE_OS::printf("Usage: egXX <Number of blocks>\n");
  53. exit(1);
  54. }
  55.   
  56. //Instatiate the Memory Manager class
  57. int n_blocks=ACE_OS::atoi(argv[1]);
  58. MessageManager mm(n_blocks);
  59.    
  60. //Use the Memory Manager class to assign messages and free them. Run this in your
  61. //debug environment and you will notice that //the amount of memory your program uses
  62. //after Memory Manager has been instantiated remains the same. That means the
  63. //Cached Allocator controls or manages all the memory for the application.
  64. //Do forever.
  65. while(1){
  66.   //allocate the messages somewhere
  67. for(int i=0; i<n_blocks;i++)
  68.   mm.allocate_msg("Hi there");
  69. //show the messages
  70. mm.display_all_msg();
  71.   
  72. for( i=0;i<n_blocks;i++)
  73.   mm.free_all_msg();
  74. }
  75. }
复制代码
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 19:46 , Processed in 0.028455 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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