gpt4 book ai didi

c++ - 为什么使用 std::make_* 而不是构造函数更好?

转载 作者:IT老高 更新时间:2023-10-28 21:51:50 25 4
gpt4 key购买 nike

STL 中有一些以 make_ 前缀开头的函数,如 std::make_pairstd::make_sharedstd::make_unique 等。为什么使用它们而不是简单地使用构造函数更好?

auto pair2 = std::pair< int, double >( 1, 2.0 );
auto pair3 = std::make_pair( 1, 2.0 );

std::shared_ptr< int > pointer1 = std::shared_ptr< int >( new int( 10 ) );
std::shared_ptr< int > pointer2 = std::make_shared< int >( 10 );
  • 我只是看到这些函数使代码更短,但仅此而已吗?
  • 还有其他优势吗?
  • 这些功能使用起来更安全吗?

最佳答案

除了启用论据推导的好处(正如其他答案中已经提到的)之外,还有一些其他好处。

std::make_pair<T1, T2>注意不要简单地返回 std::pair<T1, T2> .如果你使用 std::ref 传入一个值,则返回的对不会存储 std::reference_wrapper ,它将存储一个引用。

std::make_shared可以合并分配。 shared_ptr需要一些地方来保存无法存储在 shared_ptr 中的引用计数、弱指针列表等内容。直接地。这些可以与正在创建的对象组合在一个稍大的 block 中,而不是两个单独的 block 中。

std::make_sharedstd::make_unique两者都确保在抛出异常时不会留下任何对象。如果将函数调用为 f(std::shared_ptr<int>(new int), std::shared_ptr<int>(new int)) ,那么编译器可能首先分配两个 int对象,然后构造两个 shared_ptr<int>对象。如果分配失败,并且没有shared_ptr<int>对象已设置为在销毁时释放内存,那么您就有内存泄漏。 std::make_sharedstd::make_unique结合int的分配和 std::shared_ptr<int> 的 build 在函数调用中,另外分配intstd::shared_ptr<int> 的其他结构在另一个函数调用中。函数调用不能重叠,所以如果第二次分配失败,已经有一个共享指针将被销毁,同样撤销第一次分配。

关于c++ - 为什么使用 std::make_* 而不是构造函数更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31232146/

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