我经常遇到这种情况,你有一个临时变量,其值需要修改,,修改后你不需要访问旧值。
// Find out if the jello will be jiggly
// at a certain time
bool IsJiggly( JelloType jello, float time )
{
// JelloType has some weird overloads..
jello = jello + time ; // I don't need the unrefrigerated jello,
// _so I overwrite jello_..
return jello.jiggles() ;
}
bool IsJiggly( JelloType jello, float time )
{
JelloType jello2 = jello + time ; // I don't need the unrefrigerated jello,
// but I create a new variable anyway,
return jello2.jiggles() ;
}
(我意识到上面的例子有点做作,即JelloType
应该有一个成员函数operator+=
..但情况不是这样!)
所以,问题是: _在C ++中,覆盖变量是否更好,性能更好,或者只是创建一个新变量并使用它?_ < / p>
答案 0 :(得分:1)
通过删除临时对象并将时间传递给jiggles
函数,可以通过更好的编码风格增强您的代码,并在返回bool时将jiggles
重命名为IsJiglly
。另外一个const引用应该足够而不是对象副本(也许编译器会优化副本?):
bool IsJiggly(const JelloType& jello, float time )
{
return jello.IsJiggly(time);
}
至少这个函数是相同的,如果编译器没有删除副本,你的两个函数都可以收集更好的性能。此外,它的功能设计更好,更直观,更易于维护。
在C ++中,覆盖变量更好,性能更好,还是只创建一个新变量并使用它?
这不是一个真正的语言问题,它取决于应用程序设计。如果JeloType是一个很小的对象,复制起来非常便宜(比复制参考便宜),那么我可能不会在乎复制它。
答案 1 :(得分:1)
编译器可能会在几乎所有情况下优化差异。
请注意,只需调用您的函数即可复制jello
。如果复制JelloType
便宜,那就没问题了。如果它很昂贵,那么你应该将const引用传递给它。
在你的第二个例子中,你引入jello2
临时,你 - 理论上 - 调用另一个拷贝构造函数。如果这有副作用,那么编译器将无法对其进行优化。如果它没有副作用(一个好的拷贝构造函数应该不有副作用),那么编译器可能会消除临时(因为你的jello
参数已经是临时副本)
有时,制作副本是有意义的,例如,如果副本的名称有助于理解。如果副本不能使代码更容易理解,并且如果您已经制作了临时副本,因为您传入的是副本而不是引用,那么我可能不会介绍jello2
。
答案 2 :(得分:0)
好的,我不得不说不,先生。
C + C和C over普通机器代码的整体思想是为代码提供一些人类可理解的“含义”,并使编译器能够执行设计决策(函数可见性等)。特别是使用C ++,它允许您将变量和函数分组为“对象”,您可以将其与真实问题对象相关联。如果有的话,优化应该是你头脑中的最后一件事。与原始性能相比,您的项目更有可能因施工难度,错误和不可维护性而失败。
... SOOOOO
1)如果jello是一个简单的计数器,那么肯定,你不需要保存旧值。我们都知道它会随着时间的推移而增加,我们都知道+会做什么,我们在使用时都会小心。我只是建议把它称为jelloTime,或者其他什么。
2)如果jello是一个物体,那么NOOO:
Jello应该是与“真实”业务对象相关的实体,所以:
a)+不得用于增加时间或其他任何东西。任何人都无法知道这一点,而jello + time对我来说毫无意义。 (我的团队知道不是一个有效的答案)。添加一个名为.addFrozentTime()的方法。 (避免使用addTime(),仍然不清楚......)。
b)另外,jello将一些jello永久地称为实体,因此方法永远不会改变对象的身份,只改变其状态。 (flyweight是一个例外,但这不是重点)所以:
B1)您的评论错误:
//我不需要未冷藏的果冻
它处于不同状态的同一个对象。说“jello现在冷藏”并保留变量...
或
B2)代码错误:
jello = jello + time
所以,答案是“它取决于”,但无论哪种方式你都需要修改代码。
我的2 cts我只想帮忙。