关于《C++设计新思维》中的“小型对象分配器”的疑惑
短歌如风 2003-10-09 03:44:38 在书中谈到一个块只容纳255个对象时说:
1:否则就不能分配大小小于sizeof(unsigned short)的对象
2:由于“内存对齐问题”,把任意的指针类型转换为unsigned short *不一定有效。
但是,为了在delete时可以知道对象的大小,要求对象必须可以使用RTTI,也就是说,必须有vtpr。书中的解决办法是所有的小型对象都从一个SmallObject类衍生,而这个类有一个虚析构函数,正确地解决了size问题,但同时也产生了另一个问题:
我们知道,由于SmallObject有一个虚析构函数:
class MyObject: public SmallObject
{
char data;
};
事实上内存结构相当于:
class MyObject
{
VTBL* vtpr;
char data;
};
很明显,assert(sizeof(MyObject) >= sizeof(VTBL*))这个断言永远成立。也就是说,本来就不可能分配大小小于的一个指针大小的对象。而指针大小是1的情况……
此外,如果sizeof(MyObject)是5,还是存在内存对齐问题,把任意指针转换成unsigned short *是不一定有效,但转换成VTBL**更不一定有效。
事实上,在要求对齐的32位系统中,这个对象的大小很可能是8。那么我们本来只需要一个字节就可以表示的数据,为了使用小型对象分配器,我们就要分配8个字节,而使用小型对象分配器本来就是为了节省空间,这不是一个矛盾吗?