📅  最后修改于: 2023-12-03 14:59:51.277000             🧑  作者: Mango
在C++程序中,栈是一块内存区域,主要用于存储局部变量和函数调用的上下文信息。每次调用函数都会将该函数的参数、局部变量和返回地址压入栈中;函数返回时,会将栈中的这些信息弹出并恢复程序状态。因此,在C++中,栈的大小显然是一个重要的问题。
在C++中,堆栈大小的主要限制通常来自于操作系统。不同操作系统对于栈的大小限制不同,可供使用的栈空间也因操作系统架构和实现而异。一般来说,32-bit的操作系统栈大小为2MB,而64-bit的操作系统栈大小为8MB。
在Windows系统中,栈大小可以通过特定函数SetProcessDEPPolicy
和SYSTEM\_INFO
结构体查询,如下所示:
#include <Windows.h>
#include <iostream>
int main()
{
// 获取系统信息
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
std::cout << "Page size of the system: " << sysInfo.dwPageSize << " bytes.\n"
<< "Minimum size of the stack: " << sysInfo.dwAllocationGranularity << " bytes.\n"
<< "Recommended maximum size of the stack: " << sysInfo.dwPageSize * sysInfo.dwMaximumApplicationAddress / 1024 / 1024 << " MB.\n";
// 设置堆栈大小
SetProcessDEPPolicy(PROCESS_STACK_ALLOCATION_POLICY_ALWAYS_ON);
}
参考文献:MSDN、StackOverflow
类Unix系统中,使用ulimit
命令可以查询和设置进程堆栈大小限制。例如,查询当前Shell中的进程最大堆栈大小可以使用如下命令:
$ ulimit -s
8192
这个值表示堆栈大小限制为8MB。如果需要更改栈大小限制,可以使用如下的命令:
$ ulimit -s 16384
参考文献:Linux命令大全
下面是一个简单的代码片段,用于查询当前进程的栈大小限制:
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/resource.h>
int main()
{
rlimit rlim;
if (getrlimit(RLIMIT_STACK, &rlim) == 0)
{
std::cout << "Current stack size limit: " << rlim.rlim_cur/1024/1024 << " MB\n";
}
else
{
std::cout << "Failed to get stack size limit.\n";
}
return 0;
}