std :: array在堆栈和堆栈溢出错误上的分配

时间:2017-10-29 14:02:45

标签: c++ arrays

我对std::arraystd::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)导致堆栈溢出?

为什么不定义超出堆栈堆栈大小的对象不会导致段错误?

1 个答案:

答案 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

相关问题