tow*_*owi 30 c++ arrays stack static-allocation dynamic-allocation
是std::array<int,10>(没有我自己使用new)保证在堆栈中分配,而不是由C++ - Standard分配?
要清楚,我不是故意的new std::array<int, 10>.我主要想知道,如果允许标准库new在其实现中使用.
Yak*_*ont 21
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
};
Run Code Online (Sandbox Code Playgroud)
理论上它可以由编译器通过不是实际C++的魔法来实现,但是没有必要这样做,所以没有人会烦恼.
所以总结:是的,std::array是在堆栈上.
Log*_*uff 17
我在标准中找不到更明确的答案,但是[array.overview]/2:
数组是一个aggregate(
[dcl.init.aggr]),可以使用最多N可转换为的类型的元素进行列表初始化T.
聚集体是一个数组或一个类(条款
[class])与
- 没有用户提供的,显式的或继承的构造函数(
[class.ctor]),...
那就是它.聚合无法动态分配内存(或者在构造过程中可能自己做任何事情).只有一个隐式声明的琐碎构造函数.
当然,如果你new std::array<...>,你在"堆"上得到一个数组.
有些人可能会对我们在cppreference上获得的内容感到满意:
std::array是一个封装固定大小数组的容器.此容器是一种聚合类型,其语义与包含C样式数组
T[N]作为其唯一非静态数据成员的结构相同.
第三,std::array在C++ 11中引入.为什么?例如,std::vector在某些方面补充,例如在constexpr函数中的使用,其中不允许动态分配.