C++内存管理----第一讲(二)

在这里插入图片描述
第一个版本例子如下:
在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功能
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值