7

如果我有一个程序:

#include <iostream>

using namespace std;

int TestIntReturn(int &x, int &y)
{
    x = 1000;
    y = 1000;
    return x+y;
}

int main()
{
    int a = 1;
    int b = 2;
    cout << a << " " << b << endl;
    TestIntReturn(a,b);
    cout << a << " " << b << endl;
}

的返回值会发生什么,TestInReturn(a,b)因为它未使用?

4

7 回答 7

11

由于您在谈论 Windows,我们将假设 x86 处理器。

在这种情况下,返回值通常在寄存器 EAX 中。由于您没有使用它,因此该值将被忽略,并在下一次碰巧将某些内容写入 EAX 的代码执行时被覆盖。

在相当多的情况下,如果一个函数没有其他副作用(只接受输入并返回一些结果),编译器将能够找出您何时不使用结果,并且根本不调用该函数。

在您的情况下,该函数有一些副作用,因此它必须执行这些副作用,但可能会省略代码来计算总和。即使它没有被忽略,它也可能会发现添加的实际上是两个常量,所以它不会在任何情况下在运行时对结果进行实际计算,只是做一些类似mov EAX, 2000产生返回的事情价值。

于 2013-02-26T18:33:06.293 回答
9

它被丢弃;该表达式TestInReturn(a,b)丢弃值表达式。丢弃inta 没有任何效果,但丢弃 a volatile int(或任何其他具有 volatile 限定的类型)可能具有从内存读取的效果。

于 2013-02-26T18:30:02.857 回答
4

返回值只是被丢弃。如果没有可观察到的副作用(在您的示例中不是这种情况),优化器可能会根据具体情况决定优化整个函数调用。

因此,在从 中返回时TestIntReturn,函数会将返回值压入堆栈,然后调用者将相应地调整堆栈帧,但不会将返回值从堆栈复制到任何变量中。

于 2013-02-26T18:28:56.900 回答
0

大家都答对了——这种情况下的返回值被简单地丢弃了,在这个具体的例子中,你可以忽略它。

但是,如果返回值是指向函数内部分配的内存的指针,而您忽略它,则会发生内存泄漏。

所以一些函数值你不能忽略,但在这种情况下——你可以。

于 2013-02-26T18:54:14.440 回答
0

在原始类型的情况下,它不会发生任何事情。它只是被忽略了。在类类型的情况下,返回的对象将被破坏,而不会发生任何其他事情。

于 2013-02-26T19:34:14.770 回答
0

什么都没有 - 它进入以太,并且不被存储/使用。返回值本身是右值或临时值;我相信编译器甚至会优化临时创建,因为它实际上并没有被使用。

于 2013-02-26T18:29:19.803 回答
0

返回值存储在堆栈中,并在函数返回时弹出。由于调用者没有将它分配给变量,因此它只是在弹出堆栈时被丢弃。

于 2013-02-26T18:30:25.997 回答