在c ++中按值调用时存储变量副本的位置

use*_*434 2 c++

我想知道,当我们通过值调用一个函数时,它会复制一个变量,但是在内存中存储了这个变量的副本

Cod*_*key 5

它通常位于堆栈上,在函数调用的指针或函数的堆栈帧之前.我不知道这是否是标准所要求的,但它可能已经普遍完成.

所以拿这个例子:

int f(myClass byVal)
{
    int b;
    ...
};

...

myClass myInst;
int val = f(myInst)
Run Code Online (Sandbox Code Playgroud)

我希望堆栈看起来像f里面的省略号:

<top> b (stack frame inside of f)
pointer to f
temp copy of myInst
myInst (stack frame of outer function).
...
Run Code Online (Sandbox Code Playgroud)

当f返回时,堆栈被清理到封闭功能的框架.

值得注意的是jogojapan的评论,优化可能会导致变化,包括将一些数据放入机器内部寄存器.你永远不会指望这样的内部细节,但是理解常用的机制是很好的.

  • 回答隐含的问题:标准没有提到堆栈或它扮演的角色.标准只是说这些变量是本地(自动)变量.(另外,它们是否在堆栈中_really_取决于当然的优化.例如,它们也可能在寄存器中.) (7认同)