我对std::array
和std::vector
我目前的(简单化)理解是:
std::vector
是一个对象,它包含一个指向其值
std::array
是一个保存其数组/集合/缓冲区
这是一个非常不正确但有效的演示
printf("%llu\n", sizeof(*new std::vector<uint64_t>(10)));
printf("%llu\n", sizeof(*new std::array<uint64_t, 10>));
24 (consisting of vector things)
80 (consisting of uint64_t[10])
定义变量在堆栈上定义它
定义std::array
在堆栈上定义/分配它的数组/集合/缓冲区 - 那么为什么没有std::array<uint64_t, 1000000000000000> array
(1 PB)导致堆栈溢出?
为什么不定义超出堆栈堆栈大小的对象不会导致段错误?
答案 0 :(得分:1)
printf("%llu\n", sizeof(*new std::vector<uint64_t>(10)));
printf("%llu\n", sizeof(*new std::array<uint64_t, 10>));
首先,此处未创建std::vector<uint64_t>
和std::array<uint64_t, 10>
的对象,因为该表达式出现在Unevaluated Contexet中。
定义
std::array
定义/分配它 堆栈上的数组/集合/缓冲区 - 所以为什么不这样做std::array<uint64_t, 1000000000000000> array
(1 PB)导致堆栈 溢出?
您可能仍然在未评估的上下文中执行此操作。 Demo
但是,在评估的上下文中,例如:
int main(){
std::array<uint64_t, 1000000000000000> arr;
}
现在,根据您的环境,您可能会遇到段错误。您还应该知道,编译器可能会优化代码,(因为没有对元素的访问权限)。
其次,您的代码片段 - 不是估计具有元素的容器所消耗的内存的方法。对于std::array
,我们可以做出假设并接受代码的变体,但肯定不是std::vector
。