通过引用传递的param Vs的值的内存消耗

Memory consumption of by-value passed param Vs. by-reference

本文关键字:内存 Vs param 引用      更新时间:2023-10-16

可能的重复:
通过引用传递和通过值传递之间有什么区别?

我知道这个标题可以代表许多其他已回答的问题,我相信我的特定问题在其他线程中没有得到回答(我已经搜索过了,如果是重复的,很抱歉)。

商业:考虑下一个签名:

A:

void MyFunction(long int x);

B:

void MyFunction(long int & x);

以及下一个用法:

void main()
{
short int y = 0;
MyFunction(y);
...
}

我的问题与MyFunction的内存堆栈帧中参数的内存消耗有关。

  1. 在情况A中,参数是按值传递的,这是否意味着它将消耗sizeof(short int)字节?

  2. 在情况B中,参数是通过引用传递的,假设编译器将使用指针来实现它,这是否意味着它将消耗sizeof(pointer_type)字节——这可能大于short int?(我曾经被告知,当使用引用时,它可能会消耗64位,这取决于平台)

注意,函数接收long int类型,我想知道它是否在这两种情况下都有任何效果。

还有一个小问题——有人能发布一个编译器不会使用指针通过引用实现传递参数的例子吗?

谢谢,阿萨夫。

答案必然取决于编译器、体系结构、ABI等。

在接下来的内容中,我假设有问题的参数实际上是在堆栈中传递的,而不是在寄存器中传递的(大假设!),并且没有积极的优化。

在情况A中,参数是按值传递的,这是否意味着它将消耗sizeof(short int)字节?

否,它将消耗sizeof(long int)字节,因为它将首先被加宽以匹配MyFunction()的签名。

在情况B中,参数是通过引用传递的,假设编译器将使用指针来实现它,这是否意味着它将消耗大小为(pointer_type)字节的

总之,是的。你不能在需要long&的地方传递short&,所以我认为你的意思是在这里传递long&