gpt4 book ai didi

c++ - 优化的 C++ 编译器如何重用函数的栈槽?

转载 作者:太空狗 更新时间:2023-10-29 23:34:30 26 4
gpt4 key购买 nike

优化的 c++ 编译器如何确定函数的栈槽(函数的栈帧的一部分)何时不再需要该函数,以便它可以重用其内存? .
我所说的堆栈槽是指函数的堆栈帧的一部分,不一定是函数的整个堆栈帧,一个澄清问题的例子是,假设我们有一个函数,在它的范围内定义了六个整数变量,到时候在函数中使用第六个变量,第五个变量变得无用,因此编译器可以为第五个和第六个变量使用相同的内存块。
感谢有关此主题的任何信息。

最佳答案

编辑:我将问题解释为“编译器如何重用堆栈中的特定内存字?”以下大部分内容都回答了这个问题,最后的注释回答了这个问题,“编译器如何重用函数所需的所有堆栈空间?”。

大多数编译器不会先分配栈槽。相反,对于每个函数体,它们所做的是将每次更新都视为一个变量,以及对该变量的所有访问都可以看到那个特定的赋值,作为所谓的变量生命周期。因此,多次分配的变量将导致编译器创建多个生命周期。

(当多个分配可以通过不同的控制路径访问一个访问时,这个想法会变得复杂;通过使用一个名为 static single assignment 的巧妙增强来解决这个问题,我不打算在这里讨论) .

在代码中的任何一点,都有一组有效的变量生命周期;当您选择不同的代码点时,您将拥有不同的有效变量生命周期。编译器的实际问题是为每个生命周期分配不同的寄存器或栈槽。可以将其视为图形着色问题:每个生命周期都是一个节点,如果两个生命周期可以在代码中的某个点重叠,则从该节点到另一个节点的“干扰”弧代表另一个生命周期。您可以为图形着色(或等效地使用数字而不是颜色),使得由干扰弧连接的两个节点没有相同的颜色(数字);您可能不得不使用任意大的数字来执行此操作,但对于大多数函数而言,数字不必非常大。如果你这样做,颜色(数字)会告诉你一个安全的栈槽用于特定变量生命周期的赋值。 (这个想法通常用于大致两个阶段:一次是分配寄存器,一次是为那些不适合寄存器的生命周期分配堆栈槽)。

通过确定用作图形颜色的最大数字,编译器知道在最坏情况下需要多少个槽,并且可以在函数入口时保留那么多的存储空间。

有很多问题:不同的值占用不同的空间等,但基本思想就在这里。并非所有编译器都使用图形着色技术,但几乎所有编译器都弄清楚如何以一种避免隐含干扰的方式分配堆栈槽和寄存器。因此他们知道栈槽号和栈帧的大小。

编辑...打字时,问题似乎被解释为“函数的堆栈帧何时消失”?答案是,在函数导出处。编译器已经知道它有多大。在函数执行过程中不需要压栈或弹出栈;它知道根据图形着色确定的堆栈槽编号将所有内容放在哪里。

关于c++ - 优化的 C++ 编译器如何重用函数的栈槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3232614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com