可能重复:
如何在 C++ 中“返回一个对象”
大家好!
如果我需要从函数返回一个对象(而且它不是getter,而且由于某种原因这个函数不能作为构造函数实现,例如有一个具有相同签名和不同语义的构造函数),如何更好地实现这个?
例如,可以提出以下选项:
1)返回一个对象本身:
MyClass GetMyClass() {
MyClass a;
...
return a;
}
在大多数情况下,RVO会执行http://en.wikipedia.org/wiki/Return_value_optimization,不会调用复制构造函数,也不会产生开销。这种方法的缺点是,尽管有 RVO,但您必须指定 MyClass 的复制构造函数,但正如 Google C++ Style Guide 中所述...
C++ 中对象的隐式复制是错误和性能问题的丰富来源。
2) 返回指向对象的指针:
MyClass* GetMyClass() {
MyClass* a= new MyClass();
...
return a;
}
在这种情况下,由于在堆上分配内存会产生开销。由于 malloc 系统调用,这以某种方式减慢了程序的速度。此外,您应该在此函数之外释放内存,这意味着分配和释放在不同的逻辑单元中执行。如此处所述,为什么函数中的 malloc 内存并在外部释放它是一个坏主意?这通常是一个坏主意。
3)通过引用或指针传递值:
void GetMyClass(MyClass& a) {
...
}
在这种情况下,代码变得丑陋且可读性差
最佳做法是什么?你在你的项目中使用哪一个?当你在一个大项目上工作时,哪些标准是最重要的?