C++ 里面 可以重载运算符,实现对象池。
static void * operator new(size_t size, MEM_HINT_TYPE hint = MEM_HINT_NONE, int block = 0, const char * file_name = NULL, int line = 0)
{
void * p = NULL;
if (!s_packet_pool.IsEmpty())
{
s_packet_pool.Dequeue(p);
}
if (p == NULL)
{
p = ::operator new(size, hint, block, file_name, line);
#ifdef WIN32
if (InterlockedIncrement (&s_cur_cnt) > s_max_cnt)
{
s_max_cnt = s_cur_cnt;
}
#endif
}
return p;
};
C#里面如何重载, 实现对象池?

解决方案 »

  1.   

    重载new后使用不当是很危险的
      

  2.   

    好眼熟的代码某个开源项目中看到过。.net不支持重载new。
      

  3.   

    那C#就没法实现对象池, 那如何优化频繁NEW 开辟内存的问题呢?
      

  4.   

    c#开发的都是托管内存的,内存由clr托管,不需要你关心。这一块无法优化。
      

  5.   


    CLR有垃圾自动回收机制,但也不要太依赖于CLR,太依赖于所谓的系统维护.如果滥加引用或者对象事件注册之后,对象不使用时不及时注销事件,诸如此类,你的这些对象始终在内存中残留.比如你开辟了大块的byte[],不再使用时及时置null,以便GC及时回收
      

  6.   

    en ,好的, 我的代码里 网络包,每次都临时开辟64k的空间来存放网络包, 在一个栈里, 用完马上就置为null。。
      

  7.   

    本来有个CircularBuffer , 但是没写好。。 用个CircularBuffer来开辟64k大小的空间, 一个用来读, 一个用来写,   老写不好。。还得在看看