1

可能重复:
按引用传递与按值传递有什么区别?

我知道标题可以代表许多其他已回答的问题,我相信我的非常具体的问题没有在其他线程中得到回答(我已经搜索过,如果它是重复的,抱歉)。

对企业:考虑下一个签名:

A:

void MyFunction(long int x);

乙:

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 类型,因为我想知道它在这两种情况下是否有任何影响。

还有另一个小问题 - 任何人都可以发布一个编译器不会使用指针实现按引用传递参数的示例吗?

谢谢,阿萨夫。

4

1 回答 1

2

答案必然取决于编译器、架构、ABI等。

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

情况A,参数是传值的,是不是会消耗sizeof(short int)个字节?

不,它将消耗sizeof(long int)字节,因为它将首先扩大以匹配MyFunction()的签名。

情况B,参数是按引用传递的,假设编译器会用指针来实现,是不是意味着会消耗sizeof(pointer_type)字节

一句话,是的。你不能通过 a预期的short&地方long&,所以我假设你的意思是你在long&这里通过 a 。

于 2012-12-18T14:41:58.473 回答