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