是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
函数中使用,其中不允许动态分配。