将临时写入自己的新变量更好吗?

时间:2013-01-18 23:25:01

标签: c++ variables copy

我经常遇到这种情况,你有一个临时变量,其值需要修改,,修改后你不需要访问旧值

// 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>

3 个答案:

答案 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

  • 创建一个不同的jello,然后当然永远不会为旧对象重用旧变量!有些人后来会来,并且不能告诉你只是在错误的物体上打电话给jello,xxx。

所以,答案是“它取决于”,但无论哪种方式你都需要修改代码。

我的2 cts我只想帮忙。