在不复制数据的情况下调整紧密封装的阵列的大小

Resize tightly packed array without copying data

提问人:Reska 提问时间:11/3/2023 最后编辑:trincotReska 更新时间:11/11/2023 访问量:67

问:

我想知道是否可以在不复制数据的情况下调整动态分配数组的大小。更具体地说,当我在堆上分配一个大小为 10 的数组时,我在前 5 个位置写入一些值,这些值应该在内存中彼此相邻放置,对吧?因此,如果我想调整数组的大小,使其仅包含这 5 个前置值,有没有办法“缩小”数组的大小,而无需将所有内容复制到另一个具有合适大小的数组?

比如我可以将数组缩小到较小的大小并释放其余的内存吗?

C++ 数组 大小 内存 收缩

评论

0赞 drescherjm 11/3/2023
手动内存管理不是 c++ 的工作方式。您可能应该只使用 std::vector 而忘记手动内存管理。
0赞 Thomas Matthews 11/3/2023
为了更改阵列的容量,需要重新分配阵列。您可以重载放置以执行阵列的就地“收缩”。new
2赞 BoP 11/3/2023
可能不可能。无论如何,拆分和返回一半分配的管理将比复制 5 个整数使用更多的资源。
0赞 Pepijn Kramer 11/3/2023
只需将所需的内容移动到较小的 std::vector<T> (并确保 T 有一个 noexcept move 构造函数,是的,它仍然会复制内存,但尽可能高效)。或者只是接受你有一点未使用的内存的事实。如果您的设备内存很少,您可能无论如何都不会使用动态分配的内存。
1赞 user4581301 11/3/2023
它可以。系统可能必须分配一个新的、更小的内存块,然后您的代码会执行一堆复制。通常不值得花时间,除非您真的需要其他地方的存储。但是,考虑到智能内存管理器(按照现代标准,不是那么智能的管理器)会注意到这些未使用或很少使用的内存页,并将它们换成较慢的存储形式,以便其他用户可以使用内存。而且你什么也没做——你的代码没有变得更复杂——来实现它。

答: 暂无答案