赋值运算符的性能
Performance of assignment operator
你好,我有一个类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
的引用。
另请参阅评论中的链接,它们似乎很有用。
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 标准库类型的赋值运算符的引用限定符
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类和派生类的多态赋值运算符
- 为用户定义的类正确调用复制构造函数/赋值运算符
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 为什么初始化时没有调用重载赋值运算符?
- 赋值运算符重载和自赋值
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 对 r 值使用移动赋值运算符时的异常
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 默认赋值运算符如何在实际 STL 中实现
- 使用赋值运算符复制 std::vector
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 赋值运算符的性能
- 在 C++98 中实现移动构造函数和移动赋值运算符以获得更好的性能