可能重复:
What’s the difference between passing by reference vs. passing by value?
我知道标题可以代表许多其他已回答的问题,我相信我的非常具体的问题在其他主题中没有得到解答(我已经搜索过,抱歉,如果它是重复的话)。
开展业务:考虑下一个签名:
A:
void MyFunction(long int x);
B:
void MyFunction(long int & x);
以及下一个用法:
void main()
{
short int y = 0;
MyFunction(y);
...
}
我的问题与MyFunction的内存堆栈帧中参数的内存消耗有关。
在案例A中,参数按值传递,是否意味着它将消耗sizeof(short int)字节?
在情况B中,参数是通过引用传递的,假设编译器将使用指针实现它,是否意味着它将消耗sizeof( pointer_type )字节 - 这可能是短期int? (我曾经被告知,使用引用时它可能会消耗64位,具体取决于平台)
请注意,该函数接收long int类型,因为我想知道它是否在两种情况下都有效。
另一个小问题 - 任何人都可以发布一个例子,其中编译器不会使用指针实现by-reference传递参数吗?
谢谢, 阿萨夫。
答案 0 :(得分:2)
答案必然取决于编译器,架构,ABI等。
在下文中,我假设有问题的参数实际上是在堆栈上传递而不是在寄存器中传递(很大的假设!),并且没有积极的优化。
在情况A中,参数按值传递,是否意味着它将消耗sizeof(short int)字节?
不,它会消耗sizeof(long int)
个字节,因为它会先扩展到匹配MyFunction()
的签名。
在B的情况下,参数通过引用传递,假设编译器将使用指针实现它,是否意味着它将消耗sizeof(pointer_type)bytes
总之,是的。您无法通过short&
预期long&
的位置,所以我认为您的意思是在这里传递long&
。