/*条款50: 了解new和delete的合理替换时机*/
#include<iostream>
using namespace std;
//替换编译器提供的operator主要三个最觉的理由
// 1 用来检测运用上的错误 2 为了强化效能 3为了收集使用上的统计数据
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);//增加大小,使能够塞入两个signatrue
void *pMem = malloc(realSize);
if(!pMem)
throw bad_alloc();
*(static_cast<int*>(pMem))=signature;
*(reinterpret_cast<int*>(static_cast<Byte*>(pMem)+realSize-sizeof(int))) = signature;
return static_cast<Byte*>(pMemm)+sizeof(int);//返回指针,指向恰位于第一个signature 之后的内在位置
}
//齐位:要求指针 的地址必须是4的倍数或double的地址必须是8的倍数,如果没有奉行这个约束条件,可能导致运行期硬件异常,一些系统如果满足条件则效率最佳,malloc就是这样工作的,如果operator new 中没有返回 一个自malloc的指针,而是返回得自malloc且统称一个int大小的指针 ,没有人能保证它的安全,许多平台上已有商业产品可以替代编译器自带的内存管理器,你可以重新连接使用,但需要花点钱。另一个选择是开放源码领域的内存管理器如:BOOST的pool就这样一个分配器
// 本条主题是了解何时可在“全局性的”或“class专属”基础上合理替换缺省的new和delete
// 1 为了检测运用错误 2 为了收集动态分配内存之使用统计信息 3 为了增加分配和归还的速度 4 为了降低缺省内在管理器带来的空间额外开销 5 为了弥补缺省分配器中的非最佳齐位 6 为了将相关对象成簇集中(如果你知道特定的某个数据结构往往被一起使用,而你双希望 在处理这些数据时将“内在页错误”的频率降至最低,那么为此数据结构创建 一个heap就有意义 ) 7 为了获得非传统的行为
int main(){
return 0;
}
条款50: 了解new和delete的合理替换时机
最新推荐文章于 2023-04-18 11:41:29 发布