1

假设我有一堂课:

class MyIntegers
{
public:
  MyIntegers(int sz); //allocate sz integers in _Data and do some expensive stuff
  ~MyIntegers();      //free array

  int* _Data;
}

而这一小段代码:

int sz = 10;
MyIntegers a(sz), b(sz), c(sz);

for (int i=0; i<sz; i++)
{
  c._Data[i] = a._Data[i] + b._Data[i];
}

是否可以重载三元operator+以替换循环c=a+b而不创建临时对象?

在我的情况下,重载operator=andoperator+=并写入c=a; c+=b;以避免创建临时对象是不可接受的。

4

1 回答 1

1

您要查找的内容称为表达式模板,其中基本上表达式a+b不会导致计算结果,而是返回一个“代理”对象,其中操作(在本例中为 +)以类型编码。通常,当您需要结果时,例如在分配给变量时,在代理类型中编码的操作用于进行实际计算。

使用 C++11 的移动赋值运算符,表达式模板对优化只有一个临时的简单表达式的需求减少了(因为该临时将被移动到最终结果),但它仍然是一种避免大临时的技术。

于 2013-08-14T11:02:30.927 回答