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

问题描述 投票:2回答:3

我如何决定何时在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]);
c++ containers smart-pointers
3个回答
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 ++样式容器。


3
投票

std::vector,主要是因为它更好地代表了“连续内存中的项目序列”,它是默认表示,并支持广泛的常见操作。

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

如果幸运的话,你的STL实现`提供小矢量优化,跳过小尺寸的内存分配。 - 编辑:我不知道标准显然禁止SBO - 抱歉让你满怀希望,谢谢@KarlNicholl

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

boost确实引入了shared_array等,这更好地代表了你的第二个选择,但我还没有看到它们得到很多牵引力。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.