用C++编写返回对象的函数的最佳方法是什么

What is the best way to write a function, which returns an object in C++?

本文关键字:函数 最佳 方法 是什么 对象 C++ 返回      更新时间:2023-10-16

可能的重复:
如何在C++中"返回对象">

大家好!

如果我需要从函数返回一个对象(它不是getter,而且由于某种原因,这个函数不能作为构造函数实现,例如,有一个构造函数具有相同的签名和不同的语义),如何更好地实现它?

例如,可以提出以下选项:

1) 返回对象本身:

MyClass GetMyClass() {
MyClass a;
...
return a;
}

在大多数情况下,RVO,http://en.wikipedia.org/wiki/Return_value_optimization执行时,不调用复制构造函数,也没有开销。这种方法的缺点是,尽管有RVO,你必须指定MyClass的副本构造器,但正如谷歌C++风格指南中提到的。。。

C++中对象的隐式复制是bug和性能问题的丰富来源。

2)返回指向对象的指针:

MyClass* GetMyClass() {
MyClass* a= new MyClass();
...
return a;
}

在这种情况下,由于在堆上分配内存,会产生开销。由于malloc系统调用,这在某种程度上降低了程序的速度。此外,您应该释放此函数之外的内存,这意味着在不同的逻辑单元中执行分配和释放。如前所述,为什么在函数中分配malloc内存并将其释放到外部是个坏主意?这通常是个坏主意。

3) 通过引用或指针传递值:

void GetMyClass(MyClass& a) {
...
}

在这种情况下,代码变得丑陋且可读性差

最佳实践是什么?当你在一个大项目中工作时,你在项目中使用哪一个标准?哪些标准最重要?

Two非常简单。是的,malloc可能很慢,但这对你来说重要吗?你需要从某个地方为那个物体留出空间。还要注意你所指问题的答案,只有在逻辑单元之间才有问题。看看你是否有问题,然后尝试解决它,而不是预先优化。

您可以使用免费的商店和管理员资源自己制作自己版本的new。然而,除非你已经测量并发现新的问题,否则它很容易出错。

通过释放指针可以帮助改善问题的一种方法是使用std::shared_ptr。这样,只要始终通过智能指针使用对象,就不必担心释放对象。

您忽略了返回可移动构造对象的明显机会:在许多情况下,返回值仍然可以减少开销,但不会有意外复制的风险。在C++2011不可用的地方,我会使类型可复制并按值返回。

如果既不能移动也不能复制,我会返回一个指针。当然,我不会返回裸指针,而是返回std::unique_ptr<T>(或std::auto_ptr<T>,如果不可用):使用智能指针可以避免内存泄漏的风险,但选择轻量级指针而不是std::shared_ptr<T>并不能最终决定如何维护对象。在需要以某种有趣的方式释放对象的情况下,它可能会附带一个deleter。

相关文章: