大佬教程收集整理的这篇文章主要介绍了c – 空的别名shared_ptr是一个不起作用的删除shared_ptr的好选择?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
对于这种情况,我一直在使用一个无操作的删除程序,例如[](const void *){},但是今天我发现还有另一个选择,使用(或滥用)
void f(ExpectedClass *eC) { std::shared_ptr<ExpectedClass> p(std::shared_ptr<void>(),ec); assert(p.use_count() == 0 && p.get() != nullptr); apiCall(p); }
我的问题是,做更好的方法是什么,为什么?性能预期是否一样?使用无操作的删除器,我希望为存储删除器和引用计数支付一些成本,这在使用具有空的shared_ptr的别名构造函数时似乎不是这样.
#include <chrono> #include <iostream> #include <limits> #include <memory> template <typename... Args> auto test(Args&&... args) { using clock = std::chrono::high_resolution_clock; auto best = clock::duration::max(); for (int outer = 1; outer < 10000; ++outer) { auto Now = clock::Now(); for (int inner = 1; inner < 20000; ++inner) std::shared_ptr<int> sh(std::forWARD<Args>(args)...); auto time = clock::Now()-Now; if (time < best) { best = time; outer = 1; } } return best.count(); } int main() { int j; std::cout << "With aliasing ctor: " << test(std::shared_ptr<void>(),&j) << '\n' << "With empty deleter: " << test(&j,[] (auto) {}); }
在我的机器上输出clang -march = native -O2:
With aliasing ctor: 11812 With empty deleter: 651502
具有相同选项的GCC具有更大的比例,5921:465794.而与-stdlib = libc的Clang产生了惊人的12:613175.
以上是大佬教程为你收集整理的c – 空的别名shared_ptr是一个不起作用的删除shared_ptr的好选择?全部内容,希望文章能够帮你解决c – 空的别名shared_ptr是一个不起作用的删除shared_ptr的好选择?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。