是否有关于内存分配的模块/源文件中的函数的定量测试,如以下32位版本中所示:
#include <windows.h>
int main()
{
wchar_t TestArray [516332] = { NULL };
}
516332(或7E0EC)成功但产生516333的堆栈溢出。 当然,2Gb或7FFFFFFF的全局转换是合法的,但添加一个以获得SO。
#include <windows.h>
wchar_t TestArray [2147483647] = { NULL };
int main()
{
}
在32位版本中使用VS10 / MCBS,但X64并不好玩。 64或128系统中的函数类型(例如long,char void,bool)是否成比例增加?使用数字/表格方法专门搜索答案。
答案 0 :(得分:1)
简短回答是“不”。没有办法“检查”可用的堆栈空间大小,或堆栈的大小。一些运行时系统具有堆栈空间的知识,但没有标准,从技术上讲,C ++标准(或C标准)甚至没有规定应该有这样的堆栈(尽管它会相当困难)构建一个没有某种堆栈的系统,但从技术上讲,它不一定是堆栈指针的硬件寄存器,参数传递可以通过其他一些机制完成。)
技术上可以在64位系统中拥有更大的堆栈 - 我认为没有人开始考虑真正的128位系统 - 我们有一个公平的方法,直到当前的系统耗尽可用的64位中的位 - 当前内存映射仅处理53位 - 为了获得更多,在页表处理中将需要进行更改。目前的处理器往往有48位的内存地址实际实现 - 仍然提供65536 * 4GB,或256TB。目前的系统最大可达1-2TB,在我们用完现有产品之前,我们还有很长的路要走。
虽然技术上可能要大得多,即使在32位环境中,堆栈大小通常也只限于几兆字节。对于大量数据,您希望使用更少受限的堆 - 如果确实耗尽了,则可以恢复,这通常不会耗尽堆栈空间[并且使用大量的函数中的堆栈通常很糟糕,因为该函数的其他“使用者”可能无法意识到它使用了多少内存。对于小变量,最多几百个字节,从堆分配的开销将是显而易见的,但对于非常大的对象,如几十万forEach
,在堆上分配它的开销是微不足道的,所以这将是“正确”的事情。
对于像字符串一样的东西,我建议:
wchar_t
假设您有一个所需的大小 - 它将允许您以该大小分配单个字符串,并且最大大小受可用内存和最大分配大小的组合限制(这取决于系统,但应该是至少2GB左右。
答案 1 :(得分:1)
不确定我的问题是否正确,但是:
int main()
{
wchar_t TestArray [516332] = { NULL };
}
这里你达到了默认的1MB线程堆栈大小的限制(其他一些数据也已经在堆栈上)。可以使用Visual Studio中的/STACK:reserve[,commit]
调整默认大小。
wchar_t TestArray [2147483647] = { NULL };
int main()
{
}
在32位系统上可以达到2GB用户模式限制(可以使用/ 3GB启动开关更改)。