如果我有一个程序:
#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)
的返回值会因未使用而发生什么变化?
答案 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)
在原始类型的情况下,没有任何反应。它是 只是被忽略了在类类型的情况下,返回的对象 将被破坏,没有任何其他事情发生。