您的位置:程序门 -> c/c++ -> c++ 语言



请帮忙解释下1句话~(内存池的)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请帮忙解释下1句话~(内存池的)
发表于:2007-06-27 16:06:56 楼主
侯杰翻译的《c++设计新思维》里的loki库里的   chunk结构:
struct   chunk
{
        void   init(int   blocksize,   unsigned   char   blocks);
void*   allocate(int   blocksize);
        void   reset(int   blocksize,   unsigned   char   blocks);
        unsigned   char*   pdata_;
        unsigned   char
                firstavailableblock_,
                blocksavailable_;
};

void   chunk::init(int   blocksize,   unsigned   char   blocks)
{
        pdata_   =   new   unsigned   char[blocksize   *   blocks];
        zeromemory(pdata_,   blocksize   *   blocks);
        firstavailableblock_   =   0;
        blocksavailable_   =   blocks;

        unsigned   char   i   =   0;
        unsigned   char*   p   =   pdata_;
        for   (;   i   !=   blocks;   p   +=   blocksize)
        {
                *p   =   ++i;
        }
}

void*   chunk::allocate(int   blocksize)
{
        if   (!blocksavailable_)   return   0;

        //这时候firstavailableblock_可是0啊,乘上任何数字还是0,   按书中说的
        //firstavailableblock_存的是chunk内第一个可用块的索引号.我分配了250
        //个单位,这时我想firstavailableblock_存的是251才对,可是这里是0??    
        unsigned   char*   presult   =
                pdata_   +   (firstavailableblock_   *   blocksize);
        firstavailableblock_   =   *presult;

        --blocksavailable_;

        return   presult;
}

int   _tmain(int   argc,   _tchar*   argv[])
{
chunk   onechunk;
  onechunk.init(16,   255);
onechunk.allocate(250);
onechunk.allocate(8);
getchar();
return   0;
}
发表于:2007-06-27 16:16:451楼 得分:0
又是loki啊,早忘光了。
知道思路就可以了。
代码具体问题,你需要英文版/勘误/最新源码对照了看。
建议采用“读书不求甚解”法学这个书。
发表于:2007-06-27 16:43:462楼 得分:0
firstavailableblock_   是0么?

初始化时候是0,
但是后面对内存池有了动作后就不应该是0了吧   ...
发表于:2007-06-27 17:01:413楼 得分:0
楼主你把这个相像成一排大小一样的盒子,每个盒子的大小是blocksize,盒子的数目是blocks。你的任务就是给大家分配盒子。盒子排成一串儿,每个盒子上有编号

        for   (;   i   !=   blocks;   p   +=   blocksize)
        {
                *p   =   ++i;
        }

从前面到后面拿,所以开始是从0号盒儿(firstavailableblock),如果拿走了一个盒子,下次就得从1号盒开始给,以次类推。

allocate(int   blocksize)就是想要一个盒子。
1。给出当前的盒子,从前面数firstavailableblock那个。
unsigned   char*   presult   =
                pdata_   +   (firstavailableblock_   *   blocksize);

2。看看下一个盒子号儿是多少,记下来:
              firstavailableblock_   =   *presult;

这步是对于这个loop的:

        for   (;   i   !=   blocks;   p   +=   blocksize)
        {
                *p   =   ++i;     (把每个盒子号刷到盒子上)。
        }

3。减少个盒子:
4。把盒子换回去。
 

不过他这个程序有问题,如果blocksize不到   4   的话(盒子太小),盒子号就刷到下一个盒子上去了,最后程序会崩溃。
 



快速检索

最新资讯
热门点击