通过值传递的变量的副本是否仍保留在内存中?

时间:2016-06-21 17:58:51

标签: c++ pointers memory reference stack

我是C ++的新手,我不太清楚堆栈和堆是如何工作的。

想象一下定义一个函数并通过值将变量传递给该函数。生成该值的副本时,使用该函数后是否会从内存中删除它,否则它将保留?那么当你按值传递一个大对象时,会占用内存多长时间?

2 个答案:

答案 0 :(得分:1)

传递给函数的变量的值被复制到堆栈中,因此没有"直接内存使用",就像在堆上以dinamically方式分配内容一样。

函数完成后,堆栈指针将被修改,因此您不必关心该变量的内存使用情况。

当然,诸如整数和字符之类的变量可以在寄存器中传递。

答案 1 :(得分:0)

将变量传递给函数取决于函数的签名,变量的大小,编译器,平台和优化设置。

传递变量

  • 通过语言语法,变量可以传递给函数:
  • 按价值(或复制)
  • 通过引用(将链接传递给原始变量)
  • 通过恒定参考(与参考相同,但功能可以' t 修改变量)
  • 通过指针(传递变量的地址),包括所有 const种变种。

这是一个高级别的观点。在这种观点中,我们不知道变量是否存储在""记忆与否。我们不知道变量是否存在于寄存器中。我们所知道的是我们想要将信息传递给函数。

实施

编译器在实现变量传递时有很大的自由度。

许多编译器可能会在寄存器中传递值,具体取决于可用的寄存器数量,变量的大小和变量的数量。在这种情况下,变量不会存在于内存中。

编译器可能甚至没有通过"变量。编译器可以"内联"一个功能。在这种情况下,编译器继续发出代码而不更改寄存器。

某些编译器使用基于堆栈的内存区域来传递变量。这很方便,因为编译器会推动"在调用函数之前的变量和" pops"函数执行后的值。推送和弹出通常涉及调整专用寄存器中的值;因此,简单而优化的技术。

编译器可能决定不传递变量,而是传递指向变量的指针。例如,当通过引用传递时,编译器可能决定传递指向变量的指针(变量的地址)。在这种情况下,不复制变量的内容,而是直接访问。例如,如果变量(数据)在只读存储器中,则编译器可能决定传递指向数据的指针而不是浪费时间复制数据。

可变生命周期

通过副本传递的变量在函数内执行的持续时间内具有生命周期。

通过引用传递的变量,直到它们被调用者销毁为止。

有些形式的变量可以延长寿命。该集包括但不限于全局变量,静态变量和从动态内存分配的变量(也就是堆)。

优化

编译器有可能不会传递变量。例如,如果函数没有使用参数,则编译器可能不会传递一个参数。

众所周知,编译器会将空函数作为优化来消除。因此,不会传递任何变量。

如前所述,当函数"内联"时,减少或消除调用开销(包括变量传递)。

作为优化,编译器可以删除变量或不调用函数。例如,如果调用函数导致初始化变量,则编译器可能更喜欢执行赋值。

所以有很多"它取决于"对于你的问题。
希望这能拓宽你对变量传递的理解。