V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RedBlackTree
V2EX  ›  程序员

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

  •  
  •   RedBlackTree · 197 天前 · 1046 次点击
    这是一个创建于 197 天前的主题,其中的信息可能已经有所发展或是发生改变。
    栈空间是不是只有在函数返回时 SP 上移才会释放? For 循环内部创建的变量,会在下一次循环时被覆盖还是不断堆叠在栈里?换句话说,如果没有函数调用,无限 for 循环创建局部变量,会不会导致 stack overflow ?测试结果是不会,似乎 for 循环内的变量都是同一地址,是编译优化还是本就如此?
    10 条回复    2021-07-17 13:53:13 +08:00
    shon
        1
    shon  
       197 天前 via iPhone
    for 循环怎么创建局部变量?贴个代码让我学习一下
    zxlzy
        2
    zxlzy  
       197 天前
    for 循环里的变量是复用同一个栈空间的,你是用哪个语言?
    RedBlackTree
        3
    RedBlackTree  
    OP
       197 天前
    @zxlzy Go,是不是因为 C 的 for{}没有单独的 scope,所以 for 内的变量跟在 for 外面声明一样,只有一个?
    billlee
        4
    billlee  
       197 天前
    @RedBlackTree 有 scope, {} 内创建的变量,一步循环执行结束的时候就销毁了。所以不会堆叠
    Ediacaran
        5
    Ediacaran  
       197 天前 via Android
    for 里面是编译期的声明,不是可执行语句
    zxlzy
        6
    zxlzy  
       197 天前
    @RedBlackTree 和 C 没关系,几乎所有的语言都是这样做的,for 循环中的对象的栈帧地址是复用的
    RedBlackTree
        7
    RedBlackTree  
    OP
       197 天前
    @zxlzy 好的,感谢
    hanssx
        8
    hanssx  
       196 天前   ❤️ 1
    刚开始想觉得有意思,不过是不是有 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
        9
    hanssx  
       196 天前
    另外,C/C++可以看一下反汇编代码
    GuuJiang
        10
    GuuJiang  
       195 天前   ❤️ 1
    @RedBlackTree

    用“创建”变量这个词容易让人产生一种误解,好像变量是某种资源一样,“创建”是个消耗资源的过程,实际上所有的局部变量仅仅是 BP+N 这个地址的一个代号而已,并且这个 N 在编译时已经确定了,换句话说在运行时根本就没有所谓的“创建”变量这回事,跟是否循环没有任何关系
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   989 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:31 · PVG 03:31 · LAX 11:31 · JFK 14:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.