用程序在C++中找到最大静态数组大小
Programmatically find maximum static array size in C++
我很好奇是否可以确定C++中数组的最大大小。
#include <iostream>
using namespace std;
#define MAX 2000000
int main()
{
long array[MAX];
cout << "Message" << endl;
return 0;
}
这编译得很好,但一旦我运行它就会出现segfault(即使数组实际上并没有被引用)。我知道这也是数组大小,因为如果我把它改为1000000,它运行得很好。
那么,有没有什么地方或某种方式可以定义#define MAX MAX_ALLOWED_ARRAY_SIZE_FOR_MY_MACHINE_DEFINED_SOMEWHERE_FOR_ME
?
我其实什么都不需要这个,这个问题只是为了好奇。
没有静态确定这一点的方法,因为实际的限制取决于线程的堆栈空间。你可以创建一个新的线程,给它10兆字节的堆栈,然后你就可以分配一个相应的更大的本地数组。
您可以在堆栈上分配的数量也取决于到目前为止已经使用了多少。
void foo(int level){
int dummy[100];
cerr<<level<<endl;
foo(level+1);
}
然后,也许您可以将最后打印的级别乘以400字节。递归调用占用了大部分堆栈空间,但您可以得到一个下限。我可能在这里错过了对记忆管理的一些理解,所以可以更正。
这就是我在机器上得到的不同伪数组大小的结果。
level array size stack total
24257 100 9702800
2597 1000 10388000
260 10000 10400000
129 20000 10320000
64 40000 10240000
25 100000 10000000
12 200000 9600000
函数内部声明的大多数变量都是在堆栈上分配的,堆栈基本上是一个固定大小的内存块。试图分配一个大于堆栈大小的堆栈变量会导致堆栈溢出,这就是segfault的原因。
堆栈的大小通常为8MB,因此,在64位机器上,long max[1000000]
的大小为8*1000000 < 8MB
(堆栈是"安全的"),但long max[2000000]
的大小为8*2000000 > 8MB
,因此堆栈溢出并导致程序分段故障。
另一方面,使用malloc
动态分配数组会将内存放入堆中,堆基本上是无限制的(32位机器上为4GB,64位机器上则为17179869184GB)。
请阅读本文以了解硬件和编译器设置的限制。我不认为你可以马上定义一个MAX来使用它。
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 静态数组的自由动态数组
- 如何在C++中删除静态数组?
- 为什么 &a 和 c++ 中的静态数组相同?
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 将在堆栈上声明的元素添加到静态数组
- const_cast静态数组以添加恒常性
- 动态分配的数组和静态数组之间的区别
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以使用 constexpr 函数声明一个静态数组吗?
- 使用 lambda 初始化静态数组
- 为什么从函数返回数组时需要将数组声明为静态数组.(C++)
- 根据模板值确定的静态数组大小
- 如何使用 PHP-CPP 在 PHP 类中添加静态数组
- 包含不同大小静态数组的类的多个实例
- 从我的对象返回静态数组
- 如何避免在类中显式指定静态数组的大小
- 编译类型的时静态数组
- 来自函数参数的 C++ 静态数组声明