游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2459|回复: 6

一个内存缓冲区的例子(c++)请指正。

[复制链接]

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2006-9-25 11:16:00 | 显示全部楼层 |阅读模式

class CMemBuf
{
protected:
        int size;                //        缓冲区块大小
        int num;                //        缓冲区块数量
        int count;                //        当前缓冲区使用数量(堆栈的位置)

        char** stack;        //        数据堆栈,用来存放内存缓冲区的

        char* begin;        //        缓冲区起始地址
        char* end;                //        缓冲区结束地址
public:
        CMemBuf(int Num, int Size);
        ~CMemBuf(void);

        char* Lock();
        //        锁定一块内存

        void UnLock(char * p);
        //        释放一块内存
};

CMemBuf::CMemBuf(int Num, int Size)
{
        this->num = Num;
        this->size = Size;

        this->begin = new char[size * num];
        this->end = begin + size * num;

        this->stack = new char*[num];
        this->stack[0] = begin;
        for(int i = 1; i < num; i++)
                stack = stack[i - 1] + size;
        this->count = 0;
}

CMemBuf::~CMemBuf(void)
{
        delete begin;
        delete stack;
}

//        锁定一块内存
char* CMemBuf:ock()
{
        if (count < num)
                return stack[count++];
        else
                return new char[size];
}

//        释放一块内存
void CMemBuf::UnLock(char * p)
{
        if (p >= begin && p < end)
                stack[--count] = p;
        else
                delete p;
}

int main(int argc, char* argv[])
{
        CMemBuf men(10, 1024 * 4);        //        4k buf
        char * b1 = men.Lock();
        char * b2 = men.Lock();
        char * b3 = men.Lock();
        printf("%d,%d,%d\n", b1, b2, b3);
        men.UnLock(b1);
        //men.UnLock(b2);
        b1 = men.Lock();
        b2 = men.Lock();
        printf("%d,%d,%d\n", b1, b2, b3);
        return 0;
}

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-9-25 14:19:00 | 显示全部楼层

Re:一个内存缓冲区的例子(c++)请指正。

请参考侯捷老师的《池内春秋》

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
 楼主| 发表于 2006-9-25 20:20:00 | 显示全部楼层

Re:一个内存缓冲区的例子(c++)请指正。

嗯,看过了,不过我做的这个和候老师的说的内存池还是有一定的差别的。
他主要集中在如何尽快的分配内存上。

我写的内测池是另外一个思路,目的是尽量减少内存碎片,在程序一开始时就进行整块的内存分配,然后让自己对内存进行管理,减少运行中的内存碎片。

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-9-26 10:33:00 | 显示全部楼层

Re:一个内存缓冲区的例子(c++)请指正。

侯老师介绍的其实是stlport中的memory pool,其中认为<=256为碎片,否则直接调用:perator new,除了快速分配,同样也是为了避免碎片产生

或者你所想要做的是从一开始就把client的system memory吃完不成

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
 楼主| 发表于 2006-9-27 09:14:00 | 显示全部楼层

Re:一个内存缓冲区的例子(c++)请指正。

这个代码主要是给服务器做的,用来分配发送缓冲区的,免得因为频繁的申请内存导致内存水平。

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2006-9-28 10:04:00 | 显示全部楼层

Re:一个内存缓冲区的例子(c++)请指正。

CMemBuf::~CMemBuf(void)
{
delete begin;
delete stack;
}

是不应该用 delete[] ?

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2006-9-28 10:44:00 | 显示全部楼层

Re:一个内存缓冲区的例子(c++)请指正。

想法不错,受教了。不过C++ Programming Lanuage 3rd(SE)19.4.2的实现好像更省,而且分配数量加大时也不用:perator new;最后,只要每次分配尺寸相当于内存分页尺寸,效果就很好了,一次都分配了未必更快。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 12:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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