0

我有以下情况,简要说明:

class K {
  K clone() const{K cl; /* clone this to cl then */ return cl; }
};
K* call_clone()
{
  K k;
  return new K(k.clone());
}

编译器优化后,这会被双重复制吗?

或者:
会是C*clone()更有效的实现吗?

像这样:

class K {
  K* clone() const { K*p=new K(); /* clone this to *p then */ return p; }
};
K* call_clone()
{
  K k;
  return k.clone();
}

(我问这个是因为即使是 K 的浅拷贝也可能很昂贵,实际上它将是一个类数据结构。)

4

2 回答 2

0

传统clone()在堆上创建一个副本,例如:

T* clone() { return new T(*this); }

否则可以简单地调用复制构造函数。

所以,call_clone()应该看起来像:

K* call_clone() {
    K k;
    return k.clone();
}

编译器优化后,这会被双重复制吗?

如果clone()定义可用(函数是内联的或从模板生成的),编译器可能会优化创建局部变量和复制。

于 2012-11-14T13:57:59.823 回答
0

编译器优化后,这会被双重复制吗?

这取决于编译器。任何现代编译器都不会执行双重复制,这称为返回值优化。它不取决于 的定义clone()是否可用。

使用 C*clone() 的实现会更有效吗?

不,不会的。动态内存管理(操作符 new/delete 等)非常昂贵。它可能比执行双重复制更昂贵,具体取决于您的复制构造函数实际执行的操作。

于 2012-11-14T14:03:06.690 回答