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

时间:2016-09-17 15:00:25

标签: c++ arrays stack dynamic-allocation static-allocation

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

要明确,我的意思并不是new std::array<int, 10>。我主要想知道,如果允许标准库在其实现中使用new

2 个答案:

答案 0 :(得分:20)

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

更长的故事:

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在堆栈上。

答案 1 :(得分:16)

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

  

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

[dcl.init.aggr]/1

  

聚合是数组或类(条款[class]

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

...

关于它的内容。聚合无法动态分配内存(或者在构造过程中可能自己做任何事情)。只有一个隐含声明的简单构造函数。

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

有些人可能会更加满意我们可以获得cppreference

  

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

     

此容器是一种聚合类型,其语义与包含C样式数组T[N]作为其唯一非静态数据成员的结构相同。

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