用C++编写返回对象的函数的最佳方法是什么
What is the best way to write a function, which returns an object in C++?
可能的重复:
如何在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。
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++ 将函数指针与最佳性能相结合
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- std::使用类成员函数创建线程 - 最佳实践
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 从类中的对象调用类中的函数的最佳方法
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 最佳做法:在函数中频繁使用大时态缓冲区 (C++)
- 在 c++ 中抽象两个略有不同的函数的最佳方法是什么?
- C++最佳实践:接受uint8_t、uint16_t、uint32_t、浮点数的函数
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- 调用不属于基类的派生类函数的最佳方法是什么?
- C++最佳实践 - 函数类型别名 std::function<T> 或 T
- C++ std::string 中是否有任何函数可以计算两个字符串的相同起始字符的总数或任何最佳方法
- 从C 中的函数中动态分配的缓冲区返回的最佳模式是什么?
- 字符传递给其他函数最佳实践