C++ 通过参数传递的by值与通过引用传递的by值的内存消耗
可能重复:C++ 通过参数传递的by值与通过引用传递的by值的内存消耗,c++,pass-by-reference,memory-consumption,C++,Pass By Reference,Memory Consumption,可能重复: 我知道标题可以代表许多其他已回答的问题,我相信我的非常具体的问题在其他线程中没有得到回答(我已经搜索过了,如果是重复的,很抱歉) 商业:考虑下一个签名: A: B: 下一个用法是: void main() { short int y = 0; MyFunction(y); ... } 我的问题与MyFunction的内存堆栈框架中参数的内存消耗有关 在案例A中,参数是按值传递的,这是否意味着它将消耗sizeof(short int)字节 在案例B中,参数是通过引用传递
我知道标题可以代表许多其他已回答的问题,我相信我的非常具体的问题在其他线程中没有得到回答(我已经搜索过了,如果是重复的,很抱歉) 商业:考虑下一个签名: A: B: 下一个用法是:
void main()
{
short int y = 0;
MyFunction(y);
...
}
我的问题与MyFunction的内存堆栈框架中参数的内存消耗有关
答案必然取决于编译器、体系结构等 在下面的内容中,我假设所讨论的参数实际上是在堆栈上传递的,而不是在寄存器中传递的(大假设!),并且没有积极的优化 在案例A中,参数是按值传递的,这是否意味着它将消耗sizeof(short int)字节 不,它将消耗
sizeof(long int)
字节,因为它将首先加宽以匹配MyFunction()
的签名
在案例B中,参数是通过引用传递的,假设编译器将使用指针实现它,这是否意味着它将使用sizeof(pointer_type)字节
总之,是的。你不能传递一个
short&
而需要一个long&
,所以我假设你的意思是在这里传递一个long&
。内联是最后一个问题的答案。@KerrekSB,内联一旦就位,问题就没有意义了。此外,它不能始终应用。e、 g.虚函数
/递归函数/大函数。我认为OP对内联以外的情况更感兴趣。有趣的问题。这取决于很多事情,您需要查看由编译器创建的汇编代码。但这真的重要吗?如果对象较大<64位,则通过引用传递,如果对象等于或小于,则通过值传递。在任何情况下,假设64位已用完。不管怎样,整数都有可能作为CPU字处理(完整寄存器大小),因此即使是字符也可能占用64位作为参数。谢谢您的快速回答。您能否详细说明一下:“我假设所讨论的参数实际上是在堆栈上传递的,而不是在寄存器中传递的”?调用函数有不同的方法。可以将参数推入CPU寄存器。然后调用函数,然后将该值保留在那里以供执行。在这种情况下,不会使用额外的堆栈内存。@rioki-谢谢您的回答。但是有没有一种方法可以确定/选择调用函数的方式?@user1527008:研究编译器的文档、研究编译器的源代码和研究生成的代码是确定它的三种可能的方法。第一种方法也能很好地确定您是否有选择权。@user1527008正是molbdnilo所说的。但它更依赖于平台公约。在您的PC(x86)上可能是一种方式,而在嵌入式系统上可能是另一种方式。并不是所有的代码都在电脑上运行,所以没有一般的答案。例如,对于wintel,您有一个例子,请参见维基百科的这篇文章。
void MyFunction(long int & x);
void main()
{
short int y = 0;
MyFunction(y);
...
}