📜  什么是溢出

📅  最后修改于: 2022-05-13 01:57:02.943000             🧑  作者: Mango

什么是溢出

介绍 :
在计算机中,所有指令和数据都存储在主存储器或主存储器中。在执行期间,它们必须被传输到处理单元,也称为 CPU,根据指令执行操作,如果有任何结果,则将其发送回内存。但是这些指令和数据在执行过程中存储在 CPU 的什么地方呢?答案是寄存器。

寄存器是一个硬件单元,充当计算机处理器可以快速访问的存储区域。它们主要存储指令的地址、指令本身、操作数以及操作的结果,这些结果可以稍后加载到内存中。高级编程语言中使用的变量存储在寄存器中,或者更确切地说,它们在程序执行期间分配给特定的寄存器。

在编程语言中,可能会使用许多变量,这些变量需要存储在寄存器中以便更快地访问,从而使程序执行得更快。编译器的工作是决定如何将变量分配给寄存器。并非所有变量都分配给寄存器,而只有正在使用的变量。

不溢出的问题:
现在这里出现了两个问题——

  1. 在计算机中,寄存器的数量是有限的,因为它们是硬件单元,一旦芯片制成,就不可能增加或减少寄存器的数量。
  2. 一次不能在同一个寄存器中为两个或多个变量分配空间。

理想处理器的特点是每个周期执行越来越多的指令。因此需要更多空间来存储变量并对它们执行操作。如前所述,寄存器空间是有限的。这会导致寄存器分配失败。因此,编译器的工作就是使用寄存器和内存空间。

如果没有足够的寄存器来保存变量。然后一些变量被移动到主存储器,为需要寄存器的变量腾出空间。这称为寄存器溢出。

什么是溢出?
从形式上讲,溢出是一种技术,其中将变量从寄存器空间移出到主存储器(RAM),以便为其他变量腾出空间,这些变量将在当前正在执行的程序中使用。

为什么会溢出?
溢出是为了满足以下条件 -

  1. 避免注册分配失败 –
    当存在有限数量的寄存器来保存活动变量时,就会发生这种情况,因此它们在寄存器和内存之间交换。
  2. 函数中的参数传递 –
    参数是传递给函数的参数。当它们不能被传递到寄存器时,它们被存储在内存位置。
  3. 动态分配——
    程序员可能需要添加在运行时生成的名称。由于寄存器是静态命名的,编译器依赖内存来生成动态名称。

在函数调用期间存在第四个问题。被调用函数的主体访问整个寄存器集,因此会发生许多保存和恢复。为了克服开销,进行内存引用,这可以使用溢出。

溢出的优势 –
它几乎没有什么优点,它们是——

  1. 最大的优势是硬件性能的提高。
  2. 访问时间低于缓存(对于小溢出)。

例子 -
让我们通过一个例子来理解整个过程。考虑一个简单的表达式:

R = (A+B)*(C+D)

相应的单地址指令如下:-

1. LOAD A     // ACC = M[A]
2. ADD B      // ACC = ACC + M[B]
3. STORE T    // M[T] = ACC
4. LOAD C     // ACC = M[C]
5. ADD D      // ACC = ACC + M[D]
6. MUL T      // ACC = ACC * M[T]
7. STORE R    // M[R] = ACC

在此示例中,在指令号 3 处,存储在累加器中的值被移动到内存中并存储在那里,以便为新变量腾出空间。这是一个溢出的例子。