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



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

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

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


长话短说:

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

它有自动存储和免费存储。new访问自由存储区,"堆栈上"的变量进入自动存储区。

在实践中,为了在自由存储中分配东西,你必须冒内存不足异常的风险。所以一般的规则是保证它们不抛出的东西必须使用自动存储。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在堆栈上

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

数组是一个集合 ([dcl.init.aggr]),可以用最多N个元素进行列表初始化,这些元素的类型可转换为T

And [dcl.init.aggr]/1:

聚合是一个数组或类 (Clause [class]) with

  • 没有用户提供的,显式的或继承的构造函数 ([class.ctor]),

差不多就够了。聚合不可能动态地分配内存(或者在构造过程中自己做任何事情)。只有一个隐式声明的平凡构造函数。

当然,如果你使用new std::array<...>,你会在堆上得到一个数组。


有些人可能更满意我们在cppreference上得到的结果:

std::array是一个封装固定大小数组的容器。

该容器是聚合类型,其语义与结构体相同,其唯一的非静态数据成员是c风格数组T[N]


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

相关内容

  • 没有找到相关文章

最新更新