我是C ++的新手,我不太清楚堆栈和堆是如何工作的。
想象一下定义一个函数并通过值将变量传递给该函数。生成该值的副本时,使用该函数后是否会从内存中删除它,否则它将保留?那么当你按值传递一个大对象时,会占用内存多长时间?
答案 0 :(得分:1)
传递给函数的变量的值被复制到堆栈中,因此没有"直接内存使用",就像在堆上以dinamically方式分配内容一样。
函数完成后,堆栈指针将被修改,因此您不必关心该变量的内存使用情况。
当然,诸如整数和字符之类的变量可以在寄存器中传递。
答案 1 :(得分:0)
将变量传递给函数取决于函数的签名,变量的大小,编译器,平台和优化设置。
const
种变种。这是一个高级别的观点。在这种观点中,我们不知道变量是否存储在""记忆与否。我们不知道变量是否存在于寄存器中。我们所知道的是我们想要将信息传递给函数。
编译器在实现变量传递时有很大的自由度。
许多编译器可能会在寄存器中传递值,具体取决于可用的寄存器数量,变量的大小和变量的数量。在这种情况下,变量不会存在于内存中。
编译器可能甚至没有通过"变量。编译器可以"内联"一个功能。在这种情况下,编译器继续发出代码而不更改寄存器。
某些编译器使用基于堆栈的内存区域来传递变量。这很方便,因为编译器会推动"在调用函数之前的变量和" pops"函数执行后的值。推送和弹出通常涉及调整专用寄存器中的值;因此,简单而优化的技术。
编译器可能决定不传递变量,而是传递指向变量的指针。例如,当通过引用传递时,编译器可能决定传递指向变量的指针(变量的地址)。在这种情况下,不复制变量的内容,而是直接访问。例如,如果变量(数据)在只读存储器中,则编译器可能决定传递指向数据的指针而不是浪费时间复制数据。
通过副本传递的变量在函数内执行的持续时间内具有生命周期。
通过引用传递的变量,直到它们被调用者销毁为止。
有些形式的变量可以延长寿命。该集包括但不限于全局变量,静态变量和从动态内存分配的变量(也就是堆)。
编译器有可能不会传递变量。例如,如果函数没有使用参数,则编译器可能不会传递一个参数。
众所周知,编译器会将空函数作为优化来消除。因此,不会传递任何变量。
如前所述,当函数"内联"时,减少或消除调用开销(包括变量传递)。
作为优化,编译器可以删除变量或不调用函数。例如,如果调用函数导致初始化变量,则编译器可能更喜欢执行赋值。
所以有很多"它取决于"对于你的问题。
希望这能拓宽你对变量传递的理解。