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

如果我有一个程序:

#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)的返回值由于未被使用而发生什么?

它被丢弃 ; TestInReturn(a,b) 表达式是一个丢弃值表达式 。 抛弃一个int不起作用,但是抛弃一个volatile int (或其他任何volatile限定的类型)可以产生从内存中读取的效果。

既然你在谈论Windows,我们将假设一个x86处理器。

在这种情况下,返回值通常在寄存器EAX中。 既然你没有使用它,那么这个值就会被忽略,并且下一次在EAX中写入某些代码的代码将被执行。

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

在你的情况下,函数有一些副作用,所以它必须执行这些副作用,但可能会删除代码来计算总和。 即使没有被删除,也可能会发现被添加的内容实际上是两个常量,所以无论如何都不会在运行时对结果进行实际的计算,只需要执行像mov EAX, 2000产生返回值。

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

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

没有任何东西 – 它进入乙醚,不被储存/使用。 返回值本身是一个右值或临时值; 我相信编译器会优化即使是暂时的创建,因为它没有被实际使用。

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

大家都回答正确 – 这种情况下的返回值只是被丢弃,在这个具体的例子中,你可以忽略它。

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

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

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