gpt4 book ai didi

C++ 智能指针性能以及与简单包装指针的差异

转载 作者:行者123 更新时间:2023-12-02 13:37:02 25 4
gpt4 key购买 nike

我遇到了有人在 C++ 智能指针上做的这个测试,我想知道一些事情。首先,我听说 make_shared 和 make_unique 比共享或唯一指针的正常构造更快。但我的结果和创建测试的人的结果表明 make_unique 和 make_shared 稍微慢一些(可能没有什么重要的)。但我也想知道,在 Debug模式下,对我来说, unique_pointer 比普通指针慢大约 3 倍,而且实际上也比我自己简单地将指针包装在类中慢得多。在 Release模式下,原始指针、我的包装类和 unique_ptrs 大致相同。我想知道,如果我使用自己的智能指针,unique_pointer 是否会做一些我会丢失的特殊事情?它似乎相当重,至少在 Debug模式下它似乎做了很多事情。测试如下:

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

static const long long numInt = 100000000;

template <typename T>
struct SmartPointer
{
SmartPointer(T* pointee) : ptr(pointee) {}
T* ptr;
~SmartPointer() { delete ptr; }
};

int main() {

auto start = std::chrono::system_clock::now();

for (long long i = 0; i < numInt; ++i) {
//int* tmp(new int(i));
//delete tmp;
//SmartPointer<int> tmp(new int(i));
//std::shared_ptr<int> tmp(new int(i));
//std::shared_ptr<int> tmp(std::make_shared<int>(i));
//std::unique_ptr<int> tmp(new int(i));
//std::unique_ptr<int> tmp(std::make_unique<int>(i));
}

std::chrono::duration<double> dur = std::chrono::system_clock::now() - start;
std::cout << "time native: " << dur.count() << " seconds" << std::endl;

system("pause");
}

我找到这个的链接位于 http://www.modernescpp.com/index.php/memory-and-performance-overhead-of-smart-pointer

最佳答案

据我所知,实际问题是:

I was wondering, does the unique_pointer do anything special that I would lose if I used my own smart pointer? It seems to be rather heavy, well at least in debug mode it seems to be doing a lot.

有可能unique_ptr可能有更多琐碎的函数调用或类似的东西,这些函数没有完全内联,导致 Debug模式下的性能更差。但是,正如您自己所说,启用优化后,重要时的性能是相同的。

尽管unique_ptr是最简单的拥有智能指针,它仍然可以完成许多普通包装器无法完成的事情:

  • 它允许自定义删除器,同时通过空基类优化确保无状态自定义删除器不会使用额外空间
  • 它可以正确处理移动和复制
  • 它能正确处理各种转换;例如unique_ptr<Derived>将隐式转换为 unique_ptr<Base>
  • 它是正确的

尽管大多数优秀的 C++ 程序员都可以实现一个不错的 unique_ptr ,我认为大多数人都无法实现完全正确的方案。这些边缘情况会伤害你。

只需使用 unique_ptr ,在关闭优化的情况下自行推出以获得更好的性能并不是一个好的理由。

关于C++ 智能指针性能以及与简单包装指针的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com