“栈内存是固定的”是啥意思

谁学逆向工程 2014-06-14 03:48:38
问:函数执行完毕后,栈中的参数如何处理?
答:不用管。
由于只是临时使用存储在栈中的值,即使不在使用,清除工作也会浪费CPU资源。下一次再向栈存入其他值时,原有值会被自然覆盖掉,并且栈内存是固定的,所以既不能也没有必要释放内存。

上面说的固定,是说大小固定还是位置固定?
...全文
544 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Johnblx 2014-06-19
  • 打赏
  • 举报
回复
引用 2 楼 hnwyllmm 的回复:
我同意1楼的看法,程序的栈大小在运行期间都是固定的,不过我不同意他是在OS决定的,我没有直接证据,只有反例:VS和GCC编译器在编译的时候都可以设置栈大小 栈是怎么确定的,请大神出来解释,坐等大神
每一个程序在编译之前都会有一个连接脚本, 在连接脚本里面可以定义你的进程的地址空间的布局。 你就可以定义你的数据段,代码段,堆,栈了。 一般连接脚本都是使用系统默认带的。 我猜想,适应编译器修改的时候,就是修改的连接脚本的参数。
  • 打赏
  • 举报
回复
引用 1 楼 u014444402 的回复:
指大小与地址固定的。地址是相对的,每次运行程序可能不一样,但是在程序运行期间是固定的。这部分工作应该是在进程创建的时候OS做的。
不是OS做的吧,应该是由编译器去做的操作吧
lm_whales 2014-06-18
  • 打赏
  • 举报
回复
引用 10 楼 u013161764 的回复:
引用 1 楼 u014444402 的回复:
指大小与地址固定的。地址是相对的,每次运行程序可能不一样,但是在程序运行期间是固定的。这部分工作应该是在进程创建的时候OS做的。
不是OS做的吧,应该是由编译器去做的操作吧
Windows 32Bits ---Win32是,编译器设定大小(可能还有位置),并且编译后可以改变。 操作系统操作---------程序(进程)是加载程序加载的时候确定,线程是线程创建的时候确定------- 如果,你清楚堆栈是怎么回事,你可以自己另外设置(程序中设置新的堆栈) 小心多线程。
xiaohuh421 2014-06-18
  • 打赏
  • 举报
回复
是指大小固定的. 栈在程序编译完成后, 大小就固定了. 一般默认是1M栈空间.
mujiok2003 2014-06-16
  • 打赏
  • 举报
回复
说的是大小固定, 位置是不定的。
赵4老师 2014-06-16
  • 打赏
  • 举报
回复
/STACK (Stack Allocations) Home | Overview | How Do I | Linker Options The Stack Allocations (/STACK:reserve[,commit]) option sets the size of the stack in bytes. To find this option in the development environment, click Settings on the Project menu. Then click the Link tab, and click Output in the Category box. The Reserve text box (or in the reserve argument on the command line) specifies the total stack allocation in virtual memory. The default stack size is 1 MB. The linker rounds up the specified value to the nearest 4 bytes. The optional value specified in the Commit text box (or in the commit argument on the command line) is subject to interpretation by the operating system. In Windows NT, it specifies the amount of physical memory to allocate at a time. Committed virtual memory causes space to be reserved in the paging file. A higher commit value saves time when the application needs more stack space, but increases the memory requirements and possibly the startup time. Specify the reserve and commit values in decimal or C-language notation. Another way to set the size of the stack is with the STACKSIZE statement in a module-definition (.DEF) file. STACKSIZE overrides the Stack Allocations (/STACK) option if both are specified. You can change the stack after the .EXE file is built by using the EDITBIN tool.
lm_whales 2014-06-15
  • 打赏
  • 举报
回复
16Bits 汇编语言里面有设置栈的代码。 可以看看16Bits 实模式汇编语言编程,这样对栈的了解会更加深入。 另外32Bits 系统,以及64Bits系统,用户态和内核态,不同进程,不同线程使用的堆栈都不同。 深入了解,还可以去了解一下,段描述符,段描述附表,页目录,页表,调用门,任务门,陷阱门 等保护模式的知识。
lm_whales 2014-06-15
  • 打赏
  • 举报
回复
多线程重新定义栈要麻烦一些,因为每个线程一个栈
lm_whales 2014-06-15
  • 打赏
  • 举报
回复
栈是基本固定的,通常程序是不会改变的,是编译器设置的,并且有工具可以在编译后调整栈大小的。 这些都是编译器,操作系统,以及一些工具,处理的。 但是程序自己,也是可以配置的栈的,可以放弃原来的栈,改成用户自己的新的栈 比如动态分配新的内存,或者使用静态内存,当作新的栈用,这个用汇编比较好做。 C,C++要使用嵌入汇编处理
羽飞 2014-06-14
  • 打赏
  • 举报
回复
引用 3 楼 u014444402 的回复:
[quote=引用 2 楼 hnwyllmm 的回复:] 我同意1楼的看法,程序的栈大小在运行期间都是固定的,不过我不同意他是在OS决定的,我没有直接证据,只有反例:VS和GCC编译器在编译的时候都可以设置栈大小 栈是怎么确定的,请大神出来解释,坐等大神
没有冲突啊,我的意思是在进程创建的时候,OS会根据程序的参数进行设定栈的位置与大小。[/quote] 嗯,这样说的话对,我理解错了,呵呵
灌水号 2014-06-14
  • 打赏
  • 举报
回复
引用 2 楼 hnwyllmm 的回复:
我同意1楼的看法,程序的栈大小在运行期间都是固定的,不过我不同意他是在OS决定的,我没有直接证据,只有反例:VS和GCC编译器在编译的时候都可以设置栈大小 栈是怎么确定的,请大神出来解释,坐等大神
没有冲突啊,我的意思是在进程创建的时候,OS会根据程序的参数进行设定栈的位置与大小。
羽飞 2014-06-14
  • 打赏
  • 举报
回复
我同意1楼的看法,程序的栈大小在运行期间都是固定的,不过我不同意他是在OS决定的,我没有直接证据,只有反例:VS和GCC编译器在编译的时候都可以设置栈大小 栈是怎么确定的,请大神出来解释,坐等大神
灌水号 2014-06-14
  • 打赏
  • 举报
回复
指大小与地址固定的。地址是相对的,每次运行程序可能不一样,但是在程序运行期间是固定的。这部分工作应该是在进程创建的时候OS做的。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧