V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
RedBlackTree
V2EX  ›  程序员

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

  •  
  •   RedBlackTree · Jul 15, 2021 · 2497 views
    This topic created in 1757 days ago, the information mentioned may be changed or developed.
    栈空间是不是只有在函数返回时 SP 上移才会释放? For 循环内部创建的变量,会在下一次循环时被覆盖还是不断堆叠在栈里?换句话说,如果没有函数调用,无限 for 循环创建局部变量,会不会导致 stack overflow ?测试结果是不会,似乎 for 循环内的变量都是同一地址,是编译优化还是本就如此?
    10 replies    2021-07-17 13:53:13 +08:00
    shon
        1
    shon  
       Jul 15, 2021 via iPhone
    for 循环怎么创建局部变量?贴个代码让我学习一下
    zxlzy
        2
    zxlzy  
       Jul 15, 2021
    for 循环里的变量是复用同一个栈空间的,你是用哪个语言?
    RedBlackTree
        3
    RedBlackTree  
    OP
       Jul 15, 2021
    @zxlzy Go,是不是因为 C 的 for{}没有单独的 scope,所以 for 内的变量跟在 for 外面声明一样,只有一个?
    billlee
        4
    billlee  
       Jul 15, 2021
    @RedBlackTree 有 scope, {} 内创建的变量,一步循环执行结束的时候就销毁了。所以不会堆叠
    Ediacaran
        5
    Ediacaran  
       Jul 15, 2021 via Android
    for 里面是编译期的声明,不是可执行语句
    zxlzy
        6
    zxlzy  
       Jul 15, 2021
    @RedBlackTree 和 C 没关系,几乎所有的语言都是这样做的,for 循环中的对象的栈帧地址是复用的
    RedBlackTree
        7
    RedBlackTree  
    OP
       Jul 15, 2021
    @zxlzy 好的,感谢
    hanssx
        8
    hanssx  
       Jul 16, 2021   ❤️ 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  
       Jul 16, 2021
    另外,C/C++可以看一下反汇编代码
    GuuJiang
        10
    GuuJiang  
       Jul 17, 2021   ❤️ 1
    @RedBlackTree

    用“创建”变量这个词容易让人产生一种误解,好像变量是某种资源一样,“创建”是个消耗资源的过程,实际上所有的局部变量仅仅是 BP+N 这个地址的一个代号而已,并且这个 N 在编译时已经确定了,换句话说在运行时根本就没有所谓的“创建”变量这回事,跟是否循环没有任何关系
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5710 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 07:00 · PVG 15:00 · LAX 00:00 · JFK 03:00
    ♥ Do have faith in what you're doing.