std::堆栈和堆栈溢出错误的数组分配

std::array's allocation on stack and stack overflow errors

本文关键字:堆栈 数组 分配 栈溢出 std 错误      更新时间:2023-10-16

我对std::arraystd::vector的分配做了少量研究

我目前的(简单)理解是:

std::vector是一个对象,它保存指向其数组/集合/值缓冲区的指针

std::array 是一个保存其数组/集合/缓冲区的对象

一个非常不正确但有效的证明是

printf("%llun", sizeof(*new std::vector<uint64_t>(10)));
printf("%llun", 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) 不会导致堆栈溢出呢?

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

printf("%llun", sizeof(*new std::vector<uint64_t>(10)));
printf("%llun", sizeof(*new std::array<uint64_t, 10>));

首先,此处既不会创建 std::vector<uint64_t> 的对象,也不会创建 std::array<uint64_t, 10> 的对象,因为该表达式出现在未计算的 Contexet 中。

定义std::array定义/分配它的 堆栈上的数组/集合/缓冲区 - 那为什么不 std::array<uint64_t, 1000000000000000> array (1 PB) 导致堆栈 溢出?

您可能仍然在未评估的上下文中这样做。演示

但是,在评估的上下文中,例如:

int main(){
    std::array<uint64_t, 1000000000000000> arr;
}

现在,根据您的环境,您可能会遇到段错误。您还应该知道,编译器可能会优化代码(因为无法访问元素)。

其次,您的代码片段 - 不是估计包含元素的容器消耗的内存的方法。对于std::array,我们可能会做出假设并接受您的代码的变体,但肯定不会std::vector