第一个版本例子如下:
在Scream类中重载operator new和operator delete,这种设计引发多耗用一个next指针,该类原本只有一个int类型占4个字节,引入next指针后占8个字节。
从上面还可以发现,它的operator delete函数没有调用free,只是将区块回收到自由链表。
下页的程序是是对上面类的一个检验,首先输出一个类的实例的大小,发现确实为8,然后创建一个大小为100的指向Screen的指针数组,然后new一百次并赋给指针,打印前10个指针的地址,可以发现每两个相邻指针间隔为(说明重载后的new确实减少了原来operator new的cookie,相对右边的结果。在实际中他们的地址不一定在连续的空间,因为分配给他们的内存有可能是被打散了的。)
第二个版本:
与第一个版本最大的不同就是借用union,这里的union可以看作是将一个东西用多种角度去看它,同一个东西用不同的名称去表现它,这里的union意思是:这里有两个menber,但是它们是同一块东西,一个menber是上面的结构体占5(8)个字节,另一个menber意思是要把它看成一个指针。这种方法叫嵌入式指针。
union知识补充:
此外还有C++ STL 内存分配的思想以及使用union(共用体)的妙处
这儿的Airplane大小应该为5,但是由于内存对齐的原因打印出来仍为8。准备100个指针,new一百次,随机测试一下,输出前十个指针,观察间隔仍为8,没有消耗cookie,右边的大小是原始情况,由于每个new分配内存后首尾分别有4个字节的cookie,间隔为16.
第三个版本:
把内存分配的动作不再杂乱的散落于各个class都写一份出来,把它集中到一个allocator中去,这个allocator中维护一条链表。它专属于某个class。
版本四:在版本三上设计一个宏
标准库的allocator:
补充:new handler功能