std::array<> 是否只保证在堆栈上分配?

Does std::array<> guarantee allocation on the stack only?

std::array<int,10>(没有我自己使用 new)是否保证按 C++ 标准分配在堆栈中而不是堆中?

需要说明的是,我不是指new std::array<int, 10>。我主要想知道,是否允许标准库在其实现中使用 new

我在标准中找不到更明确的答案,但是 [array.overview]/2:

An array is an aggregate ([dcl.init.aggr]) that can be list-initialized with up to N elements whose types are convertible to T.

[dcl.init.aggr]/1

An aggregate is an array or a class (Clause [class]) with

  • no user-provided, explicit, or inherited constructors ([class.ctor]),

...

差不多就这些了。聚合无法动态分配内存(或者可能在构造期间自行执行任何操作)。只有一个隐式声明的平凡构造函数。

当然,如果你new std::array<...>,你在"the heap"上得到一个数组。


有些人可能对我们在cppreference上得到的东西更满意:

std::array is a container that encapsulates fixed size arrays.

This container is an aggregate type with the same semantics as a struct holding a C-style array T[N] as its only non-static data member.


第三,std::array是在C++11中引入的。为什么?例如,以某些方式补充 std::vector,例如在 constexpr 函数中使用,其中不允许动态分配。

TL;DR: 是的,它在堆栈上。


长话短说:

C++没有栈和堆的概念。这些是实现细节,至少有一个平台不使用传统堆栈(而是使用堆分配链表)。

它有自动存储和免费存储。 new 访问免费存储,变量 "on the stack" 进入自动存储。

实际上,为了在空闲存储上分配内容,您不得不冒内存不足异常的风险。所以一般规则是保证他们不扔的东西必须使用自动存储。 array 作出此保证(当然,除了其中的任何内容都可以抛出)。它也是普通旧数据的集合,有效地强制看起来像:

template<class T,std::size_t N>
struct array {
  T __no_fixed_name__[N];
  // non-constructor/destructor methods omitted as they are noise at this point
};

理论上它可以由编译器通过不是真正的 C++ 的魔术来实现,但没有必要那样做,所以没有人打扰。

所以结论是:是的,std::array 在堆栈上。