未使用的函数返回值会发生什么?

时间:2013-02-26 18:25:33

标签: c++ windows function return

如果我有一个程序:

#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)的返回值会因未使用而发生什么变化?

7 个答案:

答案 0 :(得分:11)

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

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

在相当多的情况下,如果一个函数没有其他副作用(只需要输入并返回一些结果),编译器将能够找出你何时没有使用结果,而只是不调用函数

在你的情况下,该函数有一些副作用,所以它必须执行这些副作用,但可能会删除代码以计算总和。即使它没有被删除,它也可能会发现所添加的内容实际上是两个常量,因此在任何情况下都不会在运行时对结果进行实际计算,只需执行{{1}之类的操作即可。生成返回值。

答案 1 :(得分:9)

被丢弃;表达式TestInReturn(a,b)废弃值表达式。丢弃int无效,但丢弃volatile int(或任何其他易失性限定类型)可能会影响从内存中读取。

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

每个人都回答正确 - 在这种情况下返回值被简单地丢弃,在这个具体的例子中,你可以忽略它。

但是,如果返回值是指向函数内部分配的内存的指针,并且忽略它,那么你将有一个memory leak.

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

答案 6 :(得分:0)

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