Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过参数传递的by值与通过引用传递的by值的内存消耗_C++_Pass By Reference_Memory Consumption - Fatal编程技术网

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)字节

  • 在案例B中,参数是通过引用传递的,假设编译器将使用指针来实现它,这是否意味着它将消耗sizeof(pointer_type)字节—这可能比short int更大? (有人告诉我,使用引用时可能会消耗64位,具体取决于平台)

  • 请注意,该函数接收long int类型,因为我想知道它在这两种情况下是否都有效果

    还有一个小问题——有人能给出一个编译器不会使用指针通过引用传递参数来实现的示例吗

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

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

    在案例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);
      ...
    }