std::堆栈和堆栈溢出错误的数组分配
std::array's allocation on stack and stack overflow errors
我对std::array
和std::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
。
相关文章:
- 为什么调用堆栈数组会导致内存泄漏
- 堆栈和队列是否像C++中的数组一样传递?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- C++ 对象数组堆栈溢出
- 在堆栈上C++大型多维数组
- 如何在 c++ 中实现堆栈数组?
- 将在堆栈上声明的元素添加到静态数组
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 在C++中使用数组时如何防止堆栈溢出?
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 堆栈数组c++的Strcpy行为
- 使用数组C++的动态堆栈
- C++堆栈中数组之间的间隙
- 如果我使用malloc()而不是堆栈数组,OpenGL不会渲染对象
- 模板堆栈对象的数组;语法
- 如何将模板类添加到堆栈数组?
- 找出堆栈数组中的下一个整数是否相同
- 堆栈数组变量清理
- C++堆栈数组限制
- c++ -本地堆栈数组与动态分配