在许多示例中,我看到这样的代码:
SomeObject* constructObject() {
SomeObject* obj = new SomeObject();
return obj;
}
但是有什么反对这样做的理由:
SomeObject constructObject() {
SomeObject obj = SomeObject();
return obj;
}
?
何时返回对象与何时返回指针的一般经验法则是什么?
编辑:一点背景:
我正在重写一个渲染器,该渲染器在渲染自身以及提供数据方面都应该很快。先前的程序员将指针存储在向量中。就像是:vector<MeshModel*>
。 MeshModel
本身没有任何继承。我认为最好使用vector<MeshModel>
,因为我不会在内存中随意跳动。我的POV错误吗?
[std::vector<MeshModel>
比std::vector<MeshModel*>
更直接。
[用于std::vector
中,可能会担心在向量增长重新分配期间进行复制/移动构建的成本。如果您的SomeObject
可以便宜地转移,那么我将使用按值存储。否则,在创建向量期间可能会有性能折衷。但这很可能不值得关注。
是否在访问对象时带来速度取决于很多其他因素(所有影响缓存的因素,例如对象大小,访问频率/步幅/可预测性,目标硬件...在这里太多列出)-如果需要,可以进行配置关于性能。但是当您从中获得任何好处时,都无需使用间接。
并且正如评论中指出的那样-远离拥有原始指针。 std::unique_ptr<MeshModel>
在显示的代码中可以正常工作。
我的POV错误吗?
没有只要不需要间接,直接值就比间接更好。
因此,问题是:是否需要间接访问?我们不能基于有限的上下文来分辨这一点。
P.S。函数几乎不应该返回像示例中那样的裸拥有指针。始终使用智能指针进行所有权。
通常,唯一地动态分配对象并按指针返回它的原因是,您需要使用多态性(即,您返回的对象是函数的return-type中声明的return-type的子类),并且您要避免使用object-slicing。但是即使那样,您也应该always使用智能指针类(例如std::unique_ptr<BaseClass>
或std::shared_ptr<BaseClass>
)返回而不是返回raw / C风格的指针,因为返回raw指针是内存泄漏的秘诀。 。
在较旧的C ++版本中,还有第二个原因,您可能想按指针返回对象,即返回的对象非常大和/或复制成本很高,并且编译器不够智能,无法实现返回值优化,以避免在返回中需要复制对象。但是,当前的C ++版本支持移动语义,因此不再需要担心。现在,返回“大”对象的效率与按指针返回对象的效率差不多。
根据我的判断,您建议的更改是“很不错的”,如果该应用程序现在可以正常运行,则该更改在工程上是不合理的。实际上,这可能是涉及到大多数代码的非常非常普遍的更改。 “仅因为您认为它发臭”不是更改它的有效engineering原因。
我建议您先确定现有的代码,然后再确定现有的代码,然后再确定现有的代码[[位置和原因,现在这样做“不够快”。每个需要的特定事物。您还应该分析每个更改的区域,以确认确实确实获得了必要的性能提升。 不假设。然后,您的项目计划应[[严格地
由概要结果显示的特定领域来驱动……,除此之外,什么都没有。