c++ - 在 Linux 下如何为可执行文件分配堆栈?

标签 c++ c linux stack

当一个二进制文件(C/C++)在Linux下执行时,

  1. 如何为进程初始化堆栈?
  2. 堆栈如何增长以及达到什么限制?
  3. 使用 ulimit,我可以有一个限制数量,通过使用 setrlimit,我可以修改它,但是到什么限制,我怎么能确定呢?<
  4. 是否为所有执行进程分配了相同的堆栈大小?

如您在下面的代码中所见,我递归调用 func() 仅用于推送操作,堆栈增长到大约 8 MB。它崩溃了(堆栈溢出!)。

void func()
{
    static int i=0;
    int arr[1024]={0};
    printf("%d KB pushed on stack!\n",++i*sizeof(int));
    func();
}

int main()
{
    func();
    return 0;
}

output snippet:

8108 KB pushed on stack!
8112 KB pushed on stack!
8116 KB pushed on stack!
8120 KB pushed on stack!
Segmentation fault (core dumped)
  1. 这大约 8 MB 来自哪里?

最佳答案

  1. 堆栈是启动时与进程关联的各种内存区域之一,在运行时可能会发生变化。其他可以是text/code、heap、static/bss等。
  2. 每次调用函数时,堆栈都会增长。在它上面添加了一个堆栈框架。堆栈帧是执行给定函数所必需的(参数、返回值、局部变量)。每次您从函数返回时,堆栈都会收缩,收缩量与增长量相同。
  3. 您可以尝试估计函数调用树的深度(f 调用 g,后者又调用 h,深度为 3调用,所以 3 个堆栈帧)。
  4. 是的,操作系统设计者估计有一个默认值。这个尺寸通常就足够了。
  5. 这是与您的操作系统关联的默认常量。

关于c++ - 在 Linux 下如何为可执行文件分配堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28737919/

相关文章:

c++ - 通过开源 PCL 使用 API 查看 3D 点云

c++ - 如何获取给定单词所在的整行并将其存储在变量中?

c - 用 C 绘制 UML 图

c++ - WM_VSCROLL 后滚动条向后移动

c - C 中十六进制字符串转换为整数

c++ - 混淆QLabel和QPixmap

c++ - DEV C++ 编译但 Visual Studio 不

windows - 学习C++(Linux+QtCreator)我应该升级到Windows+VisualC+VisualAssist吗?比较如何?

java - Linux 命令在 Java 程序中无法正常工作

c++ - 你如何确定 MySQLCPPConn 库文件在哪里?