赋值运算符的性能

Performance of assignment operator

本文关键字:性能 赋值运算符      更新时间:2023-10-16

你好,我有一个类Truck,只有一个类型为int的属性。我在整个班级中没有使用任何指针。我写了 2 个版本的operator=

Truck& operator=( Truck &x)
{
if( this != &x)
{           
price=x.getPrice();
}
return *this;
}
Truck operator=(Truck x)
{
if( this != &x)
{            
price=x.getPrice();            
}
return *this;
}

它们都可以工作,但是它们中的任何一个是否存在任何性能问题?而且,如果我使用指针来声明我的属性,我应该坚持第一种声明吗?

它们都可以工作,但是是否有任何性能问题 他们?

您发布的两个代码示例都存在潜在的性能问题。

由于类只有一个int成员,因此编写用户定义的赋值运算符(无论它看起来写得有多好)都可能比编译器默认版本实现的速度慢。

如果你的类不需要你编写用户定义的赋值运算符(或复制构造函数),那么更明智的做法是不要自己编写这些函数,因为现在的编译器本质上知道如何优化他们自己生成的例程。

析构函数也是如此 - 你看到的看似无害的空析构函数几乎是下意识的反应,可能会对性能产生影响,因为它再次覆盖了编译器的默认析构函数,该析构函数经过优化以执行任何需要做的事情。

因此,当涉及到这些函数时,底线是不要管编译器。 如果编译器默认版本的复制/赋值函数足够,请不要通过编写自己的版本来干扰。 有可能编写错误的内容(例如省略可能无法复制的成员)或执行比编译器生成的效率低的事情。

方式 1 是赋值运算符的有效方法,但建议在那里传递常量引用。它返回对this的引用,即一个轻量级指针。

方式 2 会降低性能。它构造并返回this对象的副本。此外,它是无效的。为什么赋值运算符中的引用返回是标准签名?它允许这样的表达式

copy1 = copy2 = original;
while ((one = two).condition())
doSomething();

让我们考虑以下几点:

(copy = original).changeObject();

对于方式 1,这个表达式是程序员所期望的。第二种方式是不正确的:您为 assign 运算符返回的临时对象调用changeObject,而不是为copy调用 。

你可以说:"我不想使用这种丑陋的语法"。在这种情况下,只是不允许它并且不返回任何operator=.因此,建议返回对this的引用。

另请参阅评论中的链接,它们似乎很有用。