C ++中的容器与智能指针

时间:2019-02-15 11:20:53

标签: c++ containers smart-pointers

如何确定在std :: containers(std::vectorstd::array)和指向数组的智能指针之间进行选择的方法

我知道容器是用于内存管理的对象。它们是异常安全的,不会有任何内存泄漏,并且它们还提供了用于内存管理的大量功能(push.back等),并且智能指针也是不会泄漏内存的指针,因为它们在不再需要它们时会删除它们就像超出范围时的unique_ptr一样)。可能在容器中,每次创建容器时都会产生开销。

我的问题是我该如何决定使用哪种方法以及为什么。

std::vector <unsigned char>myArray(3 * outputImageHight * outputImageWidth);

std::unique_ptr<unsigned char[]>myArray(new unsigned char[3 * outputImageHight * outputImageWidth]);

3 个答案:

答案 0 :(得分:3)

我会使用向量。您的指针版本基本上没有改进向量,并且您失去了很多有用的功能。您很可能需要在某个点上测量大小并迭代数组,使用向量可以免费获得它,而您需要针对指针版本自己实现它。在这一点上,您也可能只是使用向量开始。

可能有 实例化向量的性能,但我怀疑这对于大多数应用程序来说是瓶颈。如果创建的向量太多,实例化它们会浪费您的时间,那么您可能会更聪明地管理它们(池化内存,自定义向量分配器等)。如有疑问,请测量。

可能需要使用unique_ptr<>版本的一个示例是,如果您正在使用用C编写的库,而该库失去了数组的所有权。例如:

std::unique_ptr<unsigned char[]>myArray(
    new unsigned char[3 * outputImageHight * outputImageWidth]);

my_c_lib_data_t cLibData;
int result = my_c_lib_set_image(cLibData, myArray);

if (MYLIB_SUCCESS == result)
    // mylib successfully took ownership of the char array, so release the pointer.
    myArray.release();

但是,如果可以选择的话,请尽可能使用C ++样式的容器。

答案 1 :(得分:3)

std::vector,主要是因为它可以更好地表示“连续内存中的项目顺序”,它是默认的表示形式,并且可以进行广泛的常用操作。

vector具有移动语义,因此std :: unique_ptr的好处是有限的。

如果幸运的话,您的STL实现`提供了小型矢量优化,跳过了较小尺寸的内存分配。
-编辑:我不知道该标准显然禁止SBO-非常感谢您的指望,谢谢@KarlNicholl

如果需要指针语义,则unique_ptr<vector<T>>shared_ptr<vector<T>>是有效的选择,开销很小。

boost确实引入了shared_array等,这更好地代表了您的第二个选择, 但我还没有看到他们有多大的吸引力。

答案 2 :(得分:0)

除非有充分的理由使用指针,否则始终使用STL容器。原因是可靠性和可读性,IMO。

相关问题