我的程序一直是这样工作的。char *buf=new char[2359296];//2.25M 没办法这个必须要这么大
int len;
for (;;)
{
GetChange(buf,&len); //这是一个堵塞函数,没变化就挂起,有变化就立刻返回数据
char *dat=new char[len];//因为变化的数据可能没有2.25M这么大 所以新建一个内存
memcpy(dat,buf,len);
::PostThreadMessage(Sid,MY_US,(WPARAM)dat,(LPARAM)len);//为了不影响立即获得新变化数据,所以只能把变化的数据 交给另1条线程处理。
}//这是另1条线程
/*得到MY_US消息后处理 数据,完了后:*/
delete dat; //释放最近要优化程序,因为这样平凡的分配内存对性能不好!我应该采用什么技术? 我一直想不用重新new memcpy了,而想使用内存池管理buf,直接用buf,但是2.25M的内存是不是太大了,而且返回的数据可能只有几K。(因为有时候在前1个数据没有处理完,后面的变化都有10多次了,那么内存池里就有几十M),如果对dat使用内存池,那么内存占用大的问题解决了,但是就多了一条memcpy。
什么技术能解决呢?

解决方案 »

  1.   

    可以按段分成多个内存池,如10K,50K,100K...2.25M,读的时候从2.25M申请一个块读(如果GetChange内不能先预测长度的话),如果是大的数据,直接使用2.25M的内存块,如果是小的数据则copy到最小并能装下的内存块
      

  2.   

    1.可以采用LS的方法,内存分配链表, STL的实现有的采用这个,就是按照一定的规律分配内存大小,如:2的幂次方,按照实际的规则来分配。
    2.就是开一个很大的内存(这个可以根据实际情况来定,如果大部分都是10K或者更小,则可以分配10M,然后自己重载new和delete,让其分配内存的时候,是从你的内存中分配的,这样比较合理