不使用 new
关键字,std::array<int,10>
是否有保证被 C++ 标准在栈上而不是堆上分配内存?
需要澄清的是,我不是指 new std::array<int, 10>
,我主要想知道标准库是否允许在其实现中使用 new
关键字。
不使用 new
关键字,std::array<int,10>
是否有保证被 C++ 标准在栈上而不是堆上分配内存?
需要澄清的是,我不是指 new std::array<int, 10>
,我主要想知道标准库是否允许在其实现中使用 new
关键字。
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
};
std::array
在堆栈上。std::array
模板签名有两个参数。第一个是类型,第二个是元素数量。需要注意的是,没有第三个模板参数用于分配器。 - Trevor Boyd Smithstd::array
存储在堆栈上很重要,因为这样你就可以避免在堆栈上声明大型std::array
并导致程序崩溃。 - Trevor Boyd Smith[array.overview]/2
说:
而数组是一个聚合体 (
[dcl.init.aggr]
),它可以用最多N
个元素进行列表初始化,这些元素的类型可转换为T
。
[dcl.init.aggr]/1
说:
基本上就是这样了。聚合体不可能动态分配内存(或者说,在构造过程中自行执行任何操作)。只有一个隐式声明的平凡构造函数。聚合体是一个数组或类 (第
[class]
条) ,其中
- 没有用户提供的、显式的或继承的构造函数 (
[class.ctor]
)...
new std::array<...>
,你会得到一个位于"堆"上的数组。
std::array
是一个封装了固定大小数组的容器。这个容器是一个聚合类型,其语义与持有C风格数组
T[N]
作为其唯一非静态数据成员的结构相同。
std::array
是在C++11中引入的。为什么?例如,为了在某些方面补充std::vector
的使用,比如在constexpr
函数中使用,其中不允许动态分配内存。template <class N, size_t N> struct array { T elems[N]; };
相同的保证(实际上并没有elems
存在)。 - GManNickGnew
和<new>
规范特别描述了动态分配,所以我错过了静态分配规范的缺失。考虑到你的愚蠢编译器,我想知道是否可能在堆栈上完成所有操作。不,可能不行,我怎么支持new
呢?但这是一个不同的问题。 - towioperator new()
并使用自己选择的静态分配(某个大小)来实现。或者更好的方法是提供一个静态分配器。 - user2296177
struct S { std::array<int8_t, 10> a; };
中,sizeof(S) == 10
。 - ljleb