typedef struct {
double re,im;
} Complex;
Complex ComplexCreate(double r=0.,doublei=0.)
{
Complex c;
c.re=r;
c.im=i;
return c; // problem with this line
// my question is : is c getting duplicated and returning or does it return nothing
// when i we go back to the main
}
我知道在c ++中,我可以而且应该使用类,这只是我想要测试的东西。 在此先感谢您的帮助
答案 0 :(得分:5)
如果未启用优化,则会生成并返回c的副本。如果命名返回值优化(NRVO)可用,则编译器可以忽略该副本。
除此之外,为什么带有构造函数的类并不复杂:
class Complex
{
public:
Complex( double r = 0.0, double i = 0.0 )
: re( r )
, im( i )
{}
double re;
double im;
};
然后,如果您仍然需要像Complex ComplexCreate这样的函数(double r = 0.,doublei = 0。),它将如下所示:
Complex ComplexCreate( double r= 0.0, double i = 0.0 )
{
return Complex( r, i );
}
这里返回一个未命名的临时变量意味着没有命名返回值优化(NRVO)的编译器将有更好的机会来删除本地对象的副本 - 而是直接在调用者堆栈上工作。
答案 1 :(得分:4)
它将返回Complex
个对象,但由于NRVO,它可能无法复制。
答案 2 :(得分:3)
C将会重复,你会得到它。你可以自己检查一下:
#include <iostream>
typedef struct T {
double a;
int b;
} T;
T f() {
T newT = {10.0,5};
std::cout << "Temporary address : " << &newT << std::endl;
return newT;
}
int main(int argc,char* argv[]) {
T retT = f();
std::cout << "Final address : " << &retT << std::endl;
}
通常会产生不同的地址,如:
Temporary address : 0x7fff97d92660
Final address : 0x7fff97d926c0
答案 3 :(得分:2)
这可以帮助您理解机制:http://www.learncpp.com/cpp-tutorial/74a-returning-values-by-value-reference-and-address/
答案 4 :(得分:0)
另外
Stephen C.Dewhurst“C ++ Gotchas。避免编码和设计中的问题”
得了58。