jxh*_*jxh 8 c++ sizeof c++11 stdarray
C++标准对sizeof(std::array<char, N>)应该是什么(对于某些常量N)说了些什么?
在对不同问题的评论中,提到std::array并不总是"堆栈分配".该评论是对一个不同的评论的回应,该评论推测将过大的常量std::array声明为局部变量可能导致程序因"资源分配"变量的资源不足而中止.我假设后续评论意味着有可能std::array以某种方式切换到动态分配模式.
我可以想象,可能会有某种SFINAE应用于数组大小阈值,触发std::array实际动态分配数组并对其进行管理的特化.在这种情况下,sizeof(std::array<...>)可能只是指针的大小.这是允许发生的吗?
T.C*_*.C. 14
显然,sizeof(std::array<char, N>) != N如果N == 0.它也不一定适用N > 0.§23.3.2.1[array.overview]/p1-2:
标题
<array>定义了一个类模板,用于存储固定大小的对象序列.数组支持随机访问迭代器.array<T, N>存储N元素类型的实例T,因此size() == N是不变的.数组的元素是连续存储的,这意味着如果a是,array<T, N>则它遵循&a[n] == &a[0] + n所有的标识0 <= n < N.数组是可以使用语法初始化的聚合(8.5.1)
Run Code Online (Sandbox Code Playgroud)array<T, N> a = { initializer-list };其中
initializer-list是逗号分隔的列表,N其中包含可转换为的类型的元素T.
§8.5.1[dcl.init.aggr]/p1:
聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3) ).
由于array是聚合类型,因此它不能具有执行动态分配的自定义构造函数,并且必须直接存储元素,因为它必须能够使用聚合初始化从初始化列表初始化.但是,标准中没有任何内容阻止实现在其C样式数组成员之后添加额外的东西,只要初始化列表包含最多成员array<T, N> a = { initializer-list };时具有定义的语义.一个看起来像的实现N
template<typename T, size_t N>
struct array {
//typedefs and member functions omitted
T _Elems[N];
double _Because_I_can;
};
// specialization for N == 0 case omitted
Run Code Online (Sandbox Code Playgroud)
是完全合法的.因此,无法保证sizeof(std::array<char, N>) == N.
| 归档时间: |
|
| 查看次数: |
4092 次 |
| 最近记录: |