如果我不将它存储在任何地方,返回值会发生什么变化?

时间:2017-02-08 00:58:37

标签: c++

在下面的小样本中:

#include<iostream>
using namespace std;

int z(){
    return 5 + 10; // returns 15
}

int main(){
    z(); // what happens to this return?
    cout << "Did not fail";
    return 0;
}

15岁会怎么样?我尝试在调试器中运行它,但我无法在任何地方找到它。我认为,因为它没有被分配到任何东西它只是消失但我觉得这是错的。

我今天向TA询问了这个问题,他告诉我它存储在调用堆栈中,但是当我在调试器中查看它时,我发现它不是。

2 个答案:

答案 0 :(得分:12)

C ++标准规定了&#34; as-if&#34;规则。该规则意味着C ++编译器可以对程序执行任何操作,只要所有副作用(系统其余部分可见的输入和输出,如写入文件或在屏幕上显示内容)都得到遵守。回到我的cheeky philosophical comment,这意味着在C ++中,当一棵树落入森林而没有人在那里听到它时,它不会 发出声音(但它可以)。

对于您的程序,在高级别,由于您的函数什么也不做,编译器可能会也可能不会创建对它的调用,甚至可能从已编译的二进制文件中删除它。如果确实包含并调用它,则返回值将转到平台的应用程序二进制接口指定的任何返回槽。在几乎每个x86_64系统上,这将是整数返回值的rax寄存器。返回值在那里,但永远不会被读取,并且会在某个时候被覆盖。

如果它是一个非平凡的对象而不是int,它的析构函数将立即被调用。

答案 1 :(得分:4)

通常:当函数返回非void值并且该值未存储在任何位置时,该值将被销毁。

具体来说:自然数据类型,如intdouble或指针,没有明确的析构函数,所以没有真正发生。返回的值只会被忽略。

如果函数返回一个类实例,则会破坏类实例,这会导致调用类定义的析构函数或默认的析构函数。