gpt4 book ai didi

c++ - 用 std::valarray 替换 POD C 样式数组是个坏主意吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:02:41 27 4
gpt4 key购买 nike

我正在使用一个编写不当且存在大量内存泄漏的代码库。

它使用了很多包含原始指针的结构,这些结构主要用作动态数组。

虽然结构经常在函数之间传递,但这些指针的分配和释放是随机放置的,不容易跟踪/推理/理解。

我将其中一些更改为类,并将这些指针更改为类本身的 RAIIed。它们运行良好并且看起来并不难看,只是我禁止了这些类的复制构造和复制分配只是因为我不想花时间实现它们。

现在我在想,我是不是在重新发明轮子?为什么不用 std:array 或 std::valarray 替换 C 风格的数组?

我更喜欢 std::valarray,因为它使用堆内存和 RAIIed。 std::array 在我的开发环境中(还)不可用。

Edit1:std::array 的另一个优点是大多数动态数组都是 POD(主要是 int16_t、int32_t 和 float)数组,数字 API 可能会让生活更轻松。

在开始之前有什么我需要注意的吗?

我能想到的一个是,可能没有一种简单的方法可以将 std::valarray 或 std::array 转换回 C 风格的数组,并且我们的部分代码确实使用了指针算法并且需要呈现数据作为普通的 C 风格数组。

还有什么吗?

编辑 2

我遇到了 this question最近。 std::valarray 的一个非常糟糕的事情是它在 C++11 之前不能安全地复制赋值。

正如该答案中引用的那样,在 C++03 及更早版本中,如果源和目标的大小不同,则为 UB。

最佳答案

C 风格数组的标准替代品是 std::vector . std::valarray 是一些“怪异”的数学 vector ,用于进行类似数字计算的事情。它并不是真正设计用于存储任意对象的数组。

也就是说,使用 std::vector 很可能是一个非常的好主意。它将修复您的泄漏、使用堆、可调整大小、具有出色的异常安全性等等。

它还保证数据存储在一个连续的内存块中。您可以使用 data() 获取指向所述 block 的指针。成员函数,或者,如果您是 C++11 之前的版本,则使用 &v[0] 作为非空 vector v。然后,您可以照常使用它处理指针业务。

关于c++ - 用 std::valarray 替换 POD C 样式数组是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237758/

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