可以(或应该)使用 C++ std::array 而不是其他 STL 或 C 样式数组来解决的实际场景

Practical Schenarios that can (or should) be solved by using C++ std::array instread of other STL or C style array

尽管关于 performance\benefits\properties of std::array vs std::vector 或 C 样式数组的多个问题,我仍然没有得到明确的答案 实际使用情况和可能出现的问题类型(并且应该用 std::array 解决)。我问的原因是因为我自己和我在 C++ 中工作的所有项目中我从未见过 std::array 的任何用法,但大多数使用 std::vector 完成的工作是我们使用的案例std:deque.

在比较属性之后,数组似乎是中间的东西,就像 C 风格的数组一样,具有薄的 (not so thin - have a lot of APIs) 抽象层,但不像 std::vector 那样重。感觉如果性能真的很重要,或者我因为嵌入式设备而受到限制,我仍然会使用 C 风格的数组。

我试着比较了一些其他比较大的C++项目,例如Notepad++ source code,他们很少只在json.hpp中使用std::array,它是自己的第三方,所以总结

  1. std::array 比其他 STL 或本机数组更好地解决的实际应用有哪些?

  2. 现代 C++ 编译器是否有可能优化掉所有抽象,使其基本上像原生 C 数组一样。

  3. 我在json.hpp中注意到std::array与char_traits和模板一起使用的notepad++源代码使用,std::array是否可以用于实现大量使用模板和模板元编程的其他库,而本机 C 数组将需要更多适配器或有性能损失的解决方法?

编辑:我知道 std::array 固定大小和大小等属性是已知的,但为什么它仍然很少使用。

非常感谢:)

这个问题有点宽泛,似乎很可能走自以为是的路线,仍然:

ad.1 std::array 为 C-style 数组提供 STL-like API。此外,它可以防止数组指针衰减。通常需要后者,例如由于尺寸信息在传递时会被保留。

ad.2 至于一般情况 - 是的,std::array 是围绕其 C-style 对应物的简单薄包装。对于特定情况 - 按值传递 std::array 可能会导致复制,但 C-style 数组不会出现这种情况,因为根本无法按值传递。另一方面,这也提供了更一致的接口。 一般来说 - 如果您担心性能 - 测量。 我敢说,在大多数情况下,这根本无关紧要,如果需要一种静态数组形式,std::array 应该是 C-style 类型之上的 go-to 类型,请参阅 C++ core guidelines 关于那个话题。

广告 3 不确定我是否遵循。再说一次:std::array 是什么,主要是 C-style 的便利包装。如果你对血淋淋的细节感兴趣,你可以查阅 boost::array,它应该非常接近标准的。 的确,使用 C-style 数组可能需要更多的修补,或者只是编写与 std::array class 模板等效的东西。至于性能可能较低的解决方法,我能想到的主要方法是 vector 或其他某种形式的动态分配存储。

注意,我写了“可能”:现代编译器允许省略堆操作,所以再次 - 先测量,再判断。

此外,数组与向量的困境通常会归结为 fixed-size 与 resizable ,即程序员的意图。当然,这条规则有很多例外情况,但对于最一般的情况,我会选择先表达。