是std::array<int,10>
(没有我自己使用new
)保证在堆栈中分配,而不是由C ++ - 标准分配堆?
要明确,我的意思并不是new std::array<int, 10>
。我主要想知道,如果允许标准库在其实现中使用new
。
答案 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
。
聚合是数组或类(条款
[class]
)
- 没有用户提供的,显式或继承构造函数(
[class.ctor]
),...
关于它的内容。聚合无法动态分配内存(或者在构造过程中可能自己做任何事情)。只有一个隐含声明的简单构造函数。
当然,如果你new std::array<...>
,你会在“堆”上得到一个数组。
有些人可能会更加满意我们可以获得cppreference:
std::array
是一个封装固定大小数组的容器。此容器是一种聚合类型,其语义与包含C样式数组
T[N]
作为其唯一非静态数据成员的结构相同。
第三,std::array
是在C ++ 11中引入的。为什么?例如,以某种方式补充std::vector
,例如constexpr
函数中的用法,其中不允许动态分配。