C++智能指针的“GC”

C++的智能指针使用了引用计数来自动释放内存,因此释放内存并检查的过程,可以视为“GC”,比如有大量智能指针的节点,一次性reset指针的时候,可能会有卡顿,给出一个例子,创建50w个节点,观测GC的耗时:

#include <iostream>
#include <memory>
#include <chrono>

struct LinkNode {
    int val;
    struct std::shared_ptr<LinkNode> next{nullptr};
    LinkNode(int n): val(n), next(nullptr) {}
};
std::shared_ptr<LinkNode> CreateList(int N) {
    auto head = std::make_shared<LinkNode>(N);
    auto p = head;
    for (int i = 0; i < N; ++i) {
        p->next = std::make_shared<LinkNode>(i);
        p = p->next;
    }
    return head;
}

int main() {
    auto head = CreateList(500000);
    auto st = std::chrono::high_resolution_clock::now();
    head.reset();
    auto sp = std::chrono::high_resolution_clock::now();
    auto df = std::chrono::duration_cast<std::chrono::microseconds>(sp - st);
    std::cout << df.count() << std::endl;

    head = CreateList(1);
    st = std::chrono::high_resolution_clock::now();
    head.reset();
    sp = std::chrono::high_resolution_clock::now();
    df = std::chrono::duration_cast<std::chrono::microseconds>(sp - st);
    std::cout << df.count() << std::endl;
    return 0;
}

之后编译:

g++ test.cc -o test -O3 -std=c++14
./test

输出结果:

16788
1

因此,我们发现智能指针本身是有耗时的,主要是引用计数后删除节点上,不过内存本来就要释放,只是释放时间不同而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值