📜  c++中的堆栈大小(1)

📅  最后修改于: 2023-12-03 14:59:51.277000             🧑  作者: Mango

C++中的堆栈大小

在C++程序中,栈是一块内存区域,主要用于存储局部变量和函数调用的上下文信息。每次调用函数都会将该函数的参数、局部变量和返回地址压入栈中;函数返回时,会将栈中的这些信息弹出并恢复程序状态。因此,在C++中,栈的大小显然是一个重要的问题。

堆栈大小的限制

在C++中,堆栈大小的主要限制通常来自于操作系统。不同操作系统对于栈的大小限制不同,可供使用的栈空间也因操作系统架构和实现而异。一般来说,32-bit的操作系统栈大小为2MB,而64-bit的操作系统栈大小为8MB。

在Windows系统中,栈大小可以通过特定函数SetProcessDEPPolicySYSTEM\_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);
}

参考文献:MSDNStackOverflow

类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;
}

参考文献:Linux manpageStackOverflow