~~
内存池实现有许多种,各有不同的优缺点。
这里不是主要说内存池,只是觉得这个内存池中的指针用得很飘逸!
简单提示一下: unsigned char** next = (unsigned char**)mStartPotinter;
mStartPotinter作为二维指针的时候,相当于是一系列的unsigned char* [].
对于第一个 *next 相当于(unsigned char*)mStartPointer[0].
第二个相当于(unsigned char*)mStartPointer[sizeof(T)*1];
第三个相当于(unsigned char*)mStartPointer[sizeof(T)*2];
所以,构造BLOCK之间关系的时候,也可以写成
不想多解释了,累。估计多看几分种啥都明白了!
posted on 2010-05-03 18:33 麒麟子 阅读(1936) 评论(11) 编辑 收藏 引用 所属分类: Programming
这个使用非常的正常, 基本上内存池都是这样的结构。或者为了可读性使用一个 类似下面的union 。union BLOCK{ BLOCK* next; unsigned char data[BLOCKSIZE];};指针的强制类型转换和0字节的数组在Win32 API中广泛使用着 回复 更多评论
嗯,是的! 谢谢讲解! 回复 更多评论
@jmchxy 这样行么? union BLOCK { unsigned char* next; unsigned char data[BLOCKSIZE]; }; 回复 更多评论
@小时候可靓了 我个人觉得 union BLOCK { DWORD next; unsigned char data[BLOCKSIZE]; }; 这样写都行,只要能把这个指针的地址保存到 data的前4个字节,后面自己做强制转换就好了,不过BLOCK* next这样的格式是科学的,用void* 或DWORD来声明指针,然后用*(T*)这样的格式去取,就太不和谐了 回复 更多评论
谢谢讲解 回复 更多评论
@zuhd 嗯,谢谢,我早上脑残了。哈哈 回复 更多评论
就是把一整块内存分成多块,利用未使用位置串联下这些块。很多代码都会涉及到这种用法。 回复 更多评论
@Kevin Lynx 嗯,就是这样的!!! 回复 更多评论
不知道还有其它方式么!! 回复 更多评论
很棒,学习了。 不过,这对单个block的分配是个很好的解决方案, 但是要是分配多个block呢? 在重载delete操作符的函数中,是没有办法知道要本次要删除的内存 到底有多少个块,也就没有办法维护这些block中的地址表。当然, 除非把block数作为参数传进去,但这样的话,就造成了用户 的麻烦,用户在删除分配给自己的内存的时候还必须记得这块内存里 的block的数目,万一写错了,后果不堪设想。 回复 更多评论
我觉得这种方法有一个限制:sizeof(T) >= sizeof(指针)用union那种就没事了,仅仅是这样做空间上划不来而已 回复 更多评论
Powered by: C++博客 Copyright © 麒麟子