关于栈空间的大小

博客介绍了进程虚拟地址空间中栈空间的用途,且其大小可改变。重点讲述了在Linux环境下查看和改变栈空间大小的方法,Linux默认栈空间为8M;还提及VS2017默认栈空间为1M,以及只对本项目有效的更改方式。

点击此处阅读原文

在进程的虚拟地址空间中,栈空间用来为函数开辟栈帧以及存放局部变量,栈空间相对于堆空间是较小的,但是这也不是绝对的,因为栈空间的大小是可以被改变的。

Linux

查看栈空间大小

在Linux环境下,可以通过ulimit -a来查看栈空间的大小:

AQHGad.png

stack size字段即代表栈空间的大小,可以看出Linux环境下默认的栈空间大小为8M

改变栈空间大小

使用ulimit -s [目标栈空间大小]可以改变系统的栈空间大小:

AQvMY4.png

注意:千万不要将栈空间改为0,否则机器上的任何进程都不能运行,自然也不能重新改回来。

VS2017

默认栈空间大小

经过查阅资料得知,在VS2017上的默认栈空间大小为1M

更改栈空间大小

项目->属性->链接器->系统->栈空间保留大小,这样的更改方式只对本项目有效。

### 计算程序中栈空间大小的方法 在程序运行时,栈空间主要用于存储函数调用过程中产生的局部变量、参数以及返回地址等信息。计算程序中栈空间大小可以通过多种方式进行,具体取决于开发环境和工具链的支持。 #### 1. **使用编译器或调试工具** 一些编译器和调试工具提供了直接分析栈空间使用情况的功能。例如,在IAR Embedded Workbench中,可以通过以下步骤启用栈使用跟踪功能: - 打开菜单 `Tools -> Options -> Stack`。 - 启用选项 `Enable graphical stack display and stack usage tracking`。 此功能可以帮助开发者直观地看到程序运行过程中栈的使用情况,并确定最大栈使用量[^4]。 #### 2. **手动测试方法** 通过编写特定的测试代码来估算栈空间的使用情况是一种常见的做法。一种方法是使用已知的填充模式(如0xAA)填充栈底的一部分内存区域,然后在程序执行后检查该区域是否被修改。这种方法可以用来估算某个函数或代码段使用的栈空间大小。例如,下面是一个简单的测试示例: ```c // 用0xAA填充栈底512字节 void stack_test_begin(void) { register int i; unsigned char mem[512]; for(i = 0; i < 512; i++) { mem[i] = 0xAA; } } // 检查栈底,返回栈大小 int stack_test_end(void) { register int i; unsigned char mem[512]; for(i = 0; i < 512; i++) { if(mem[i] != 0xAA) { return 512 - i; } } return 0; } // 被测试函数, 此函数理论占用栈空间为128字节 void stack_use_128(void) { register int i; char mem[128]; for(i=0; i<128; i++) { mem[i] = 0; } } // 测试 void main(void) { int stack_size; stack_test_begin(); stack_use_128(); stack_size = stack_test_end(); printf("stack: %d\n", stack_size); } ``` 这段代码首先在栈底填充了512字节的0xAA值,然后调用了`stack_use_128`函数,该函数理论上会占用128字节的栈空间。最后,通过检查栈底未被破坏的数据长度来估算实际使用的栈空间大小[^2]。 #### 3. **利用调试器查看寄存器** 对于更底层的分析,可以直接使用调试器来查看栈顶和栈底指针的值,从而计算出栈空间大小。通常涉及以下步骤: - 设置断点并显示寄存器状态,特别是`rsp`(栈顶指针)。 - 使用`bt`命令显示当前堆栈。 - 根据显示的堆栈编号,使用`frame $frameNo`命令切换到堆栈的底部。 - 再次显示寄存器状态,特别是`rbp`(栈底指针)。 - 使用Python或其他方式计算两个地址之间的差值,得到栈空间大小。 这些步骤可以帮助开发者精确地了解程序运行时栈空间的实际使用情况[^3]。 ### 总结 不同的开发环境和工具链可能支持不同的方法来计算程序中的栈空间大小。选择合适的方法取决于项目的具体需求和技术条件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值