根据经验法则返回指针与返回对象?

问题描述 投票:0回答:4

在许多示例中,我看到这样的代码:

SomeObject* constructObject() {
    SomeObject* obj = new SomeObject();
    return obj;
}

但是有什么反对这样做的理由:

SomeObject constructObject() {
    SomeObject obj = SomeObject();
    return obj;
}

何时返回对象与何时返回指针的一般经验法则是什么?

编辑:一点背景:

我正在重写一个渲染器,该渲染器在渲染自身以及提供数据方面都应该很快。先前的程序员将指针存储在向量中。就像是:vector<MeshModel*>MeshModel本身没有任何继承。我认为最好使用vector<MeshModel>,因为我不会在内存中随意跳动。我的POV错误吗?

c++ return dynamic-memory-allocation
4个回答
3
投票

[std::vector<MeshModel>std::vector<MeshModel*>更直接。

[用于std::vector中,可能会担心在向量增长重新分配期间进行复制/移动构建的成本。如果您的SomeObject可以便宜地转移,那么我将使用按值存储。否则,在创建向量期间可能会有性能折衷。但这很可能不值得关注。

是否在访问对象时带来速度取决于很多其他因素(所有影响缓存的因素,例如对象大小,访问频率/步幅/可预测性,目标硬件...在这里太多列出)-如果需要,可以进行配置关于性能。但是当您从中获得任何好处时,都无需使用间接。

并且正如评论中指出的那样-远离拥有原始指针。 std::unique_ptr<MeshModel>在显示的代码中可以正常工作。


2
投票

我的POV错误吗?

没有只要不需要间接,直接值就比间接更好。

因此,问题是:是否需要间接访问?我们不能基于有限的上下文来分辨这一点。

P.S。函数几乎不应该返回像示例中那样的裸拥有指针。始终使用智能指针进行所有权。


0
投票

通常,唯一地动态分配对象并按指针返回它的原因是,您需要使用多态性(即,您返回的对象是函数的return-type中声明的return-type的子类),并且您要避免使用object-slicing。但是即使那样,您也应该always使用智能指针类(例如std::unique_ptr<BaseClass>std::shared_ptr<BaseClass>)返回而不是返回raw / C风格的指针,因为返回raw指针是内存泄漏的秘诀。 。

在较旧的C ++版本中,还有第二个原因,您可能想按指针返回对象,即返回的对象非常大和/或复制成本很高,并且编译器不够智能,无法实现返回值优化,以避免在返回中需要复制对象。但是,当前的C ++版本支持移动语义,因此不再需要担心。现在,返回“大”对象的效率与按指针返回对象的效率差不多。


0
投票

根据我的判断,您建议的更改是“很不错的”,如果该应用程序现在可以正常运行,则该更改在工程上是不合理的。实际上,这可能是涉及到大多数代码的非常非常普遍的更改。 “仅​​因为您认为它发臭”不是更改它的有效engineering原因。

我建议您先确定现有的代码,然后再确定现有的代码,然后再确定现有的代码[[位置和原因,现在这样做“不够快”。每个需要的特定事物。您还应该分析每个更改的区域,以确认确实确实获得了必要的性能提升。 不假设。然后,您的项目计划应[[严格地

由概要结果显示的特定领域来驱动……,除此之外,什么都没有。
© www.soinside.com 2019 - 2024. All rights reserved.