推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?



我有一些C++代码,如下所示:

#include <memory>
void do_memory()
{
std::unique_ptr<int[]> ptr = std::make_unique<int[]>(50);
int* ptr2 = new int[50];
delete[] ptr2;
}

在第一种情况下,我正在创建一个指向 int 数组的唯一指针,在第二种情况下,我正在分配一个原始 int 数组。 两个数组在离开示波器时都会被清理干净。 玩弄这段代码(例如 https://godbolt.org/g/c3gEfV(,我看到这两组指令的优化程序集是不同的,因为make_unique执行值初始化(具体来说,它似乎将分配数组的所有值设置为 0(。 因此,make_unique引入了一些不必要的开销。

在不自动初始化值的情况下将unique_ptr分配给数组(如上文所示(的推荐方法是什么? 我已经尝试过例如

std::unique_ptr<int[]> ptr = std::unique_ptr<int[]>(new int[50]);

但是在我的应用程序中,我还有一个限制,即我在编译时不知道数组的大小,因此我不想分配任何具有(编译时(常量大小的数组。

如果你真的必须,只需编写你自己的函数:

template <typename T>
std::unique_ptr<T> make_unique_uninitialized(const std::size_t size) {
return unique_ptr<T>(new typename std::remove_extent<T>::type[size]);
}

避免直接创建unique_ptr的诱惑:

std::unique_ptr<T[]>(new T[size])  // BAD

因为这通常不是异常安全的(出于您首先使用make_unique的所有常见原因 - 考虑具有多个参数和异常的函数调用(。

> C++20 更新

C++20引入了std::make_unique_for_overwrite,它的工作方式与std::make_unique一样,只是它执行默认初始化而不是值初始化。

相关内容

  • 没有找到相关文章

最新更新