假设我有一个Vector3
类,其中包含normalize()
方法。该方法是否应该返回一个新的Vector3
,或者修改它被调用的Vector3
实例(因此返回对它自己的引用(Vector3&
)?)有哪些情况会优先选择一个在另一个?性能怎么样?
答案 0 :(得分:5)
答案取决于班级的设计。
对于可变类rotate
应该旋转向量本身。这被认为更有效,如果是大型对象,它可以避免在向量中包含许多项目时复制大量数据。
另一方面,不可变类必须只返回新对象,因为它们不能自己变异。这增加了一些开销,但它有很多优点,特别是当必须同时使用对象时。
常见的命名约定是使用动词来改变操作,如
myVector.rotate(angle);
myVector.scale(factor);
而返回新对象的操作应使用past participles命名,如
auto newVector = myVector.rotated(angle).scaled(factor);
答案 1 :(得分:2)
竞争目标:正确与绩效(有时)。
如果使用不可变类型,则可以更轻松地编写正确(并行)程序。如果你使用可变类型,你有时会有一些性能优势,一旦你尝试并行,可能会丢失。然后是80/20规则。 80%的代码无需优化。那么为什么默认使用可变类型呢?
首先是不可变的,然后看看它是否有足够的性能,然后优化,如果没有。
答案 2 :(得分:0)
Vector3 rotate(const Angle& angle)
可能很好,但很好地取决于Vector3
是否正确实施。特别是关于std::move()
行为。
答案 3 :(得分:0)
副作用。例如,如果我传递了一个我从地图中检索到的对象,并且你对我传递的对象做了一些事情,那么你已经改变了我的地图内部的东西,下次我要求它时,我得到的东西不是看起来和我上次一样。保持对象不可变可以防止这样的事故发生,特别是当多个开发人员在同一个应用程序上工作时。