通过引用传递自定义类型-任何性能优势

Passing custom types by reference — any performance benefit?

本文关键字:任何 性能 类型 自定义 引用      更新时间:2023-10-16

编译后的代码有区别吗?

point operator-(point const&a,point const&b)

point operator-(point a,point b)

?其中point是自定义结构?

我想是的。point operator-(point const&a,point const&b)更好有两个原因:通过引用传递意味着您可以避免重新复制对象的开销。另一个是它引用了const,这意味着constpoint的非const版本都可以使用这个函数。

可以。

使用第一种方法,生成ab的副本并传递给函数。如果Point是一个大的classstruct,这可能是昂贵的。

通过引用传递const的好处是

  • 你可以在const对象上使用这个方法,因为你已经阻止了对变量的修改
  • 你可以安全地传递一个临时函数。

这在很大程度上取决于构造函数的复杂性和对象的大小。

如果我们有:

class point
{
    int x;
    int y;
   public:
    point(int ax, int ay) : x(ax), y(ay) { }
};

则好处非常小,如果有的话(因为operator-中的使用将更加复杂)。

另一方面,如果point是:
class point
{
    BigInt<200> x;
    BigInt<200> y;
   public:
    point(int ax, int ay) : x(ax), y(ay) { }
};

其中BigInt是用于"大数"计算的200字节数组,因为您以飞米为单位模拟整个宇宙。当然,复制200 * 2字节* 2对象的工作量很大,按值传递不是一个好主意。

同样适用于创建/销毁point对象很复杂的情况(例如,如果构造函数分配内存…)。

但是就像我上面暗示的那样,它也取决于operator-中的使用-如果有很多访问必须在引用上完成,它可以比直接复制参数堆栈慢。