【问题标题】:Is there a heap allocated fixed-size array in the standard library?标准库中是否有堆分配的固定大小数组?
【发布时间】:2021-08-28 07:55:40
【问题描述】:

我正在寻找与 C++ 中的 .NET 固定大小数组等效的东西,但通过谷歌搜索找到此信息时遇到了真正的麻烦。 std::array 通过将长度直接嵌入到其类型中来模仿 Pascal。 std::vector 很好,但在堆栈上传递了大约 3 个指针,我只希望其中一个。

也不是基于迭代器的数组,因为我正在为 functional language 开发 C++ 后端,我希望它是基于大小的,以便与 .NET 和 Cython 后端中的数组匹配。

我应该实现自己的数组类吗?

编辑:我要求的是作为库的一部分的灵活数组(例如this one)。

【问题讨论】:

  • “堆栈上大约有 3 个指针”是什么意思? Vector 通常确实有三个指针,但你不能像那样 memcpy 它。您通常会通过引用传递它,这通常实现为指针。
  • 三个指针与否,你不要传递它们。您可以创建一个副本,其中涉及重复动态分配和复制每个元素,因此三个指针在那里不是问题。或者,你通过引用传递,相当于一个指针。
  • 好的,所以你的问题标题有点误导。人们阅读“固定大小”,但您的意思不是“在编译时固定”,而是“在执行期间分配后固定”。使用 std::vector,可能是动态分配的。滚动自己的容器很乏味,而且好处令人怀疑。先把它弄对,然后以基准和测试为基础,优化它。
  • 根据到目前为止的 cmets,很好的猜测是这个问题应该更好地解释功能需求。目前,该问题使用六个词(“相当于 .NET 固定大小数组”)来描述功能要求,然后再深入探讨为什么某些选择不起作用。要求的字数与取消选项的字数之比可能应该颠倒过来。
  • 从您的问题和迄今为止的所有 cmets 来看,您似乎对 C++ 有一些误解。首先,注意给出的建议,使用std::vector。然后了解 C++ 的基础知识,尤其是按值和按引用(或作为指针)传递参数。

标签: c++ arrays


【解决方案1】:

你可以使用unique_ptr:

#include <memory>

int main() {
  // note brackets  vvvv
  std::unique_ptr<int[]> arr{ new int[42] };
  arr[0] = 13;
  // ...
}

【讨论】:

  • 这不分配固定大小的数组。
  • @user7860670 为什么不呢?它分配了一个无法调整大小的数组。
  • 分配项目数组与分配单个固定大小的数组略有不同。据我所知,实际上根本不支持。例如using tp = int[42]; tp * p{new tp{}}; 会导致错误。
  • @user7860670 这确实分配了一个数组,并返回一个指向第一个元素的指针。否则,UB 会将指针索引为arr[42]。请注意,除非pp+n 指向同一数组中的元素,否则执行p[n] 是UB。
  • @MarkoGrdinić 不,标准库中没有这样做。像this 这样的东西怎么样(不太符合)。请注意,您几乎可以肯定 想要使用std::vector,因为它具有 3 个指针这一事实并不重要,因为您从不在 C++ 中通过按位复制传递对象。您通过引用传递它们,这是一个单一指针的副本价值。
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2013-10-28
  • 2013-01-05
  • 2011-12-04
  • 2015-09-11
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多