请教大家一个关于栈空间的问题

2021-07-15 20:00:22 +08:00
 RedBlackTree
栈空间是不是只有在函数返回时 SP 上移才会释放? For 循环内部创建的变量,会在下一次循环时被覆盖还是不断堆叠在栈里?换句话说,如果没有函数调用,无限 for 循环创建局部变量,会不会导致 stack overflow ?测试结果是不会,似乎 for 循环内的变量都是同一地址,是编译优化还是本就如此?
1532 次点击
所在节点    程序员
10 条回复
shon
2021-07-15 20:17:23 +08:00
for 循环怎么创建局部变量?贴个代码让我学习一下
zxlzy
2021-07-15 20:28:53 +08:00
for 循环里的变量是复用同一个栈空间的,你是用哪个语言?
RedBlackTree
2021-07-15 20:32:58 +08:00
@zxlzy Go,是不是因为 C 的 for{}没有单独的 scope,所以 for 内的变量跟在 for 外面声明一样,只有一个?
billlee
2021-07-15 20:37:28 +08:00
@RedBlackTree 有 scope, {} 内创建的变量,一步循环执行结束的时候就销毁了。所以不会堆叠
Ediacaran
2021-07-15 20:46:08 +08:00
for 里面是编译期的声明,不是可执行语句
zxlzy
2021-07-15 20:54:55 +08:00
@RedBlackTree 和 C 没关系,几乎所有的语言都是这样做的,for 循环中的对象的栈帧地址是复用的
RedBlackTree
2021-07-15 21:12:25 +08:00
@zxlzy 好的,感谢
hanssx
2021-07-16 11:07:12 +08:00
刚开始想觉得有意思,不过是不是有 BUG ?”无限 for 循环创建局部变量“你这个怎么做到?
```c
for (int i = 0; i < 3; ++i) {
int a;
int b;
}
```
这样么?这样可不是无限创建局部变量,只有 2 个局部变量,那就是 a b,一方面是有块级作用域的语言像 C/C++,int a 、int b 在一次 for 循环结束时应该就释放了空间,然后下一次再给栈空间,这样是无法做到 stackoverflow 的;另一方面像没有块级作用域的语言如 PHP/Python/JS 等,那每次 for 循环应该就是(重新)赋值罢了。
hanssx
2021-07-16 11:08:23 +08:00
另外,C/C++可以看一下反汇编代码
GuuJiang
2021-07-17 13:53:13 +08:00
@RedBlackTree

用“创建”变量这个词容易让人产生一种误解,好像变量是某种资源一样,“创建”是个消耗资源的过程,实际上所有的局部变量仅仅是 BP+N 这个地址的一个代号而已,并且这个 N 在编译时已经确定了,换句话说在运行时根本就没有所谓的“创建”变量这回事,跟是否循环没有任何关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/789780

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX