(一)

为什么有人想要替换operator new 和 operator delete呢?三个常见的理由:

(1)用来检測运用上的错误。

(2)为了强化效果。

(3)为了收集使用上的统计数据。

(二)

以下是个高速发展得出的初阶段global operator new。促进并协助检測“overruns”或“underruns”。

static const int signature = 0xDEADBEEF;
typedef unsigned char Byte;
void* operator new(std::size_t size) throw(std::bad_alloc) {using namespace std;size_t realSize = size + 2 * sizeof(int);void* pMem = malloc(realSize);if(!pMem) throw bad_alloc();//将signature写入内存的最前段落和最后段落*(static_cast<int*>(pMem)) = signature;*(reinterpret_cast<int*>(static_cast<Byte*>(pMem)+realSize-sizeof(int))) = signature;return static_cast<Byte*>(pMem) + sizeof(int);
}

这个operator new的主要缺点在于疏忽了身为这个特殊函数所应该具备的“坚持c++规矩”的态度。条款51说全部operator new都应该内含一个循环,重复调用某个new_handling函数,这里却没有。这儿我们暂且忽略之。

如今仅仅想专注一个比較微妙的主题:alignment(齐位).

(三)
齐位。对齐方式。
很多计算机系统要求特定的类型必须放在特定的内存地址上。

比如可能会要求指针地址必须是4倍数(four-byte aligned)或double是的地址必须是8倍数。假设没有奉行这个条件,可能导致执行期硬件异常。

有些系统结构比較慈悲。而是宣称假设齐位条件获得满足。便提供较佳效率。比如Intel x86体系结构上doubles能够对齐于不论什么byte边界,但假设他是8-byte齐位,其訪问速度会快非常多。

(个人理解。没有对齐的话。微处理器的读取指针在每次读取数据的时候都要事先加上offset,所以会影响速度)

c++要求全部的operator news返回的指针都有适当的对齐(取决于数据类型),malloc就是在这种要求下工作,全部operator new返回一个malloc的指针是安全的。

然而。我们返回的是一个得自malloc且偏移一个int大小的指针。

没人保证它的安全。假设client调用operator new企图取得足够一个double所用的内存,而我们在一部“ints为4bytes且double必须8bytes齐位”的机器上跑,我们可能会获得一个未有适当齐位的指针。

那可能会造成程序崩溃或速度变慢。

(四)
何时可在“全局性的”或“class专属的”基础上合理替换缺省的new和delete:
(1)为了检測运用错误。
(2)为了收集动态分配内存的使用统计信息。
(3)为了添加分配和归还的速度。
(4)为了减少缺省内存管理器带来的额外空间开销。
(5)为了弥补缺省分配器中的非最佳齐位(suboptimal alignment)。
(6)为了将相关对象成簇集中。
(7)为了获得非传统行为。
请记住:
(1)有很多理由须要写个自定的new和delete。包含改善效能、对heap运用错误进行调试、收集heap使用信息。

Effective C++ 条款 50:了解new和delete的合理替换时机相关推荐

  1. Effective C++ 条款02:尽量使用const,enum,inline替换#define

    Effective C++ 条款02:尽量使用const,enum,inline替换#define 用另一句话说:用编译器代替预处理器比较好. 举个例子:加入定义一个常量: #define ASPEC ...

  2. 【50】了解new和delete的合理替换时机

    1.有时候,我们替换掉编译器提供的new或者delete.首先思考,为什么想要替换?下面是三个常见理由: a.用来检测运用上的错误,超额分配一些内存,再额外的空间放置一些内存: b.为了强化效能,编译 ...

  3. Effective C++条款粗略总结

    文章目录 Effective C++ 1.类/结构体 2.资源管理 3.实现 4.模板与泛型编程 5.定制new和delete 6.其他 Effective C++ 1.类/结构体 1.把C++看成一 ...

  4. Effective C++条款(第三版-侯杰译)

    条款一:视C++为一个语言联邦 [C++高效编程守则视情况而变化,取决于你使用的C++哪一部分] 条款二:尽量以const,enum,inline替换#define [对于单纯变量,最好以const对 ...

  5. effective c++条款11扩展——关于拷贝构造函数和赋值运算符

    effective c++条款11扩展--关于拷贝构造函数和赋值运算符 作者:冯明德 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 以下讨论中将用到的例 ...

  6. Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously)

    Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously) 条款39:明智而审慎地使用private继承 1.pr ...

  7. Effective C++条款30:透彻了解inlining的里里外外(Understand the ins and outs of inlining)

    Effective C++条款30:透彻了解inlining的里里外外(Understand the ins and outs of inlining) 条款30:透彻了解inlining的里里外外 ...

  8. Effective STL 条款30

    http://blog.csdn.net/amin2001/article/details/8063 STL容器在被添加时(通过insert.push_front.push_back等)自动扩展它们自 ...

  9. Effective C# 原则50:了解ECMA标准(译)

    Effective C# 原则50:了解ECMA标准 Item 50: Learn About the ECMA Standard ECMA标准是C#语言所有功能的官方说明.ECMA-334定义了C# ...

  10. Effective C++条款09:绝不在构造和析构过程中调用virtual函数

    Effective C++条款09:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruc ...

最新文章

  1. mysql双机热备的实现
  2. mysql union join_MySQL 超新手入门(5) JOIN 与 UNION 查询
  3. 活动目录数据库授权恢复
  4. STM32低功耗模式测试
  5. link 和 style 元素在 HTML 文档中的位置
  6. 论文阅读-可变形卷积网络:Deformable Convolutional Networks
  7. 下载各省、市、县的行政区划边界数据
  8. 测试面试中的常见10道接口面试题
  9. RPG Maker MV如何导入dlc素材?
  10. DNS隧道通信的检测
  11. 支付宝小程序H5域名配置
  12. 华为认证是自学还是报班合适
  13. An exceptionCaught event was fired,and it ched at the tail of the pipeline,it usually means the last
  14. UE4插件BlueMan_VehicleAI使用
  15. 后台管理有什么作用?
  16. 使用计算机报点系统时填记,铁路 车务 运转系统 自动闭塞《接发列车作业标准》...
  17. qt listwidget 关键字颜色_seo关键字优化工具如何收费
  18. Java中枚举类型Enum的一种使用方式
  19. 事实表的分类:事务事实表,周期快照事实表,累计快照事实表
  20. 中山大学软件工程专硕考研经验(双非跨考)

热门文章

  1. 北邮有高考日语学计算机专业的吗,学计算机去北邮好还是去成电好呢?没有最好只有最合适...
  2. python清空list_python怎么清空list
  3. 微型计算机期末总结卷首语,个人总结卷首语.doc
  4. crossentropy java_示例CrossEntropyLoss用于pytorch中的3D语义分段
  5. python打开浏览器全屏_python 打开浏览器的两种方式
  6. pythonATM,购物车项目实战_补充1-结构图
  7. 京东方班单片机和c语言,pic单片机c语言程序设计14.pdf
  8. (转) windows 下ORA-12514:TNS 监听问题
  9. Docker 搭建Spark 依赖singularities/spark:2.2镜像
  10. Windows服务器时间同步设置大比拼