赋值运算符的性能

时间:2017-05-25 21:11:57

标签: c++ assignment-operator

您好我有一个类.wrapper{ display: flex; margin: 1rem; } .wrapper button, input { margin: 0 0.5rem; } ,只有一个类型为Truck的属性。我没有在全班使用任何指针。我写了int的两个版本:

operator=

它们都有效,但是其中任何一个都有任何性能问题吗?而且,如果我使用指针声明我的属性,我应该坚持第一种声明吗?

2 个答案:

答案 0 :(得分:1)

  

它们都有效,但任何人都有任何性能问题   它们?

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

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

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

与析构函数相同的东西 - 看起来无害的空析构函数,你看到写的几乎是一个膝盖反应可能会对性能产生影响,因为它再次覆盖了编译器的默认析构函数,它被优化为执行任何需要的操作要做。

因此,当谈到这些功能时,底线就是让编译器独立。如果编译器的默认版本的复制/赋值功能足够,请不要通过编写自己的版本进行干扰。有可能写出错误的东西(例如遗漏你可能无法复制的成员)或做一些比编译器产生的效率低的东西。

答案 1 :(得分:0)

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

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

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

让我们考虑以下几点:

(copy = original).changeObject();

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

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

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