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
.
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
在堆栈上。
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 toN
elements whose types are convertible toT
.
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
在堆栈上。