[英]C++ What actually happens in assembly when you return a struct from a function?
[英]What happens when you return a reference from a c++ function?
问题不在于为什么以及何时应该使用它。 我想知道在低级别到底发生了什么,因为我们得到了非常奇怪的结果。
例如,当您像这样使用它时很清楚:
int& func(int& num) {
++num;
return num;
}
这里我们通过引用传递一个变量,改变它,并返回一个对同一个变量的新引用。
但是如果我们这样做会发生什么? :
int& func(int num) {
++num;
return num;
}
当 function func
完成时,变量num
不再存在。 C++ 不允许在没有使用变量初始化的情况下创建引用。 但是在这种情况下,编译和执行 go 都没有错误。 例如,如果我们不初始化int
,我们会得到随机行为:
int num;
std::cout << num; // gives 6422352 or sth like that
但是如果我们用上面的 function 初始化它:
int num1(1);
int num2(func(num1));
cout << num2; // console freezes for a second or two, and execution stops, without any errors
所以我一直在想:
num2
?从 function返回对局部变量的引用并没有错。 但是,使用该引用会导致未定义的行为。
好吧,我用g++ version 5.4.0
编译了你的代码。
所以我一直在想:
- 为什么我们没有收到返回对不存在的 object 的引用的编译错误?
编译器不会给出错误,但会给出警告。
sampe.cpp: In function ‘int& func(int)’:
sampe.cpp:6:15: warning: reference to local variable ‘num’ returned [-Wreturn-local-addr]
int& func(int num)
^
此外,您不会返回对不存在的 object 的引用。 当您返回参考时, object (或者更确切地说是int
)存在并且没有超出范围。 一旦执行了return
语句,它就会超出范围。
这就是编译器编译代码并给出警告的原因。
- 分配给 num2 的是什么?
- 为什么它不会导致任何执行错误,而只是停止程序?
现在,当我执行程序时,我每次都会得到Segmentation fault
(没有任何输出)。 快速使用gdb
告诉我这条线
int num2(func(num1));
在main()
中是罪魁祸首。 这是我的程序崩溃的地方。
==================================================== ==
TLDR;
正如对您的问题的评论和@Hi - love SO 的回答中所述,很明显,返回对局部变量的引用没有任何问题。
可能您只是在使用旧的编译器,当您的程序进入未定义的行为领域时,它能够以某种方式为您提供 output。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.