C++裸指针和智能指针的效率对比

您所在的位置:网站首页 智能指针效率 C++裸指针和智能指针的效率对比

C++裸指针和智能指针的效率对比

2024-07-14 22:11| 来源: 网络整理| 查看: 265

 1.unique_ptr与queue连用,unique_ptr的使用特点:不能使用拷贝构造函数,拷贝赋值函数,但是可以使用move构造函数和move赋值函数。

2.std::move的使用,可以将左值表达式强制转化成为右值表达式

3. 重载new操作符调试内存使用情况,因为心里不是很放心(智能指针真的为我释放了内存么?)所以尝试了重写new delete操作符。

4. 得到的结果是raw_ptr:unique_ptr:shared_ptr的性能是5:7:11,可见智能指针的效率还是相当诱人。

#include #include #include #include #include using namespace std; static size_t s_my_int_count = 0; const int MAX_LOOP_ = 3000000; const int NORMAL_FLAG = 0x12ff0101; const int MY_INT_FLAG = 0x12ff0102; void* operator new(std::size_t size)throw(std::bad_alloc)//重写new操作符为的是统计我们关心的内存分配 { int addLen = sizeof(size_t); void * p = std::malloc(addLen + 4 + size) ; if (!p) throw std::bad_alloc() ; memcpy(p, &size, addLen);//标志实际长度 memcpy((char*)p + addLen, &NORMAL_FLAG, 4);//标志类型,普通---0x12ff0101, 我自己的int---0x12ff0102, 我自己的char[]---0x12ff0103 return ((char*)p + addLen + 4); } void* operator new(std::size_t size, int flag)throw(std::bad_alloc)// 对应于调用 “new(MY_INT_FLAG) int” 这样所有我们关心的内存多可以被监视 { int addLen = sizeof(size_t); void * p = std::malloc(addLen + 4 + size) ; if (!p) throw std::bad_alloc() ; if (flag == MY_INT_FLAG){ s_my_int_count ++;//统计关心的内存申请次数 } memcpy(p, &size, addLen);//标志实际长度 memcpy((char*)p + addLen, &flag, 4);//放置标志位,标志类型,普通---0x12ff0101, 我自己的int---0x12ff0102, 我自己的char[]---0x12ff0103 return ((char*)p + addLen + 4); } void operator delete(void * q) throw() { void* p; int addLen = sizeof(size_t); p = (char*)q - addLen - 4;//还原原来的指针位置,p是真正的系统malloc出来的指针 int flag; memcpy(&flag, (char*)p + addLen, 4);//得到标志位 if (flag == MY_INT_FLAG){//统计关心的内存释放次数 s_my_int_count --; } if (p) std::free(p) ; } void main(){ queue intQueue; int count = 0; count = 0; cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3