假设你有一个使用一个(常量)参数的改变版本的C ++函数。
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
MyObject const & altered( alter_obj( original ) );
// ...
}
这正常工作,由于临时的寿命延长,因为“最重要的常量”。这也是相当有效的,如果alter_obj()
符合返回值优化的要求,如视网膜静脉阻塞是指返回值改变的对象不是不必要复制。
这也将是有效的,如果你没有作出更改都:
void func( MyObject const & original ) {
MyObject const & not_altered( original );
// ...
}
给定对象的其他引用基本上都是免费的,不进行复制的任何性能开销。
但是,说要求改了一下,你要选择是否要作出更改取决于运行条件。天真,我本来期望,使用三元运算符,前面两种方法结合起来将是有效的,直接结合原来的对象可能的情况下,或结合临时如果不。
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
// ...
MyObject const & possibly_altered(
apply_alteration ?
alter_obj( original ) :
original
);
// ...
}
但是,看来,这种做法效率不高,因为我本来希望。三元运营商显然需要最后两个参数match on lvalue/rvalue status,不只是对名义类型。这意味着,采取虚假的(没有变化)的分支时,临时右值是通过调用original
的MyObject的拷贝构造函数取得。如果为MyObject是不平凡的拷贝,还有由于使这个“伪”拷贝一个潜在的性能损失。
有没有解决这个好办法?是否有可能有效地结合本地引用至其他现有的参考或临时(基于运行时的值选择)不进行额外的副本?
我想创建单独的函数,它接受参考,并调用它,就像这样:
void func( MyObject const & original ) {
if (apply_alteration)
func_internal(alter_obj(original));
else
func_internal(original);
}
void func_internal( MyObject const & possibly_altered) {
// ...
}
也许添加第二个参数来func()
?
void func( MyObject const& original, bool modify = false ) {
if ( modify ) MyObject const & altered( alter_obj( original ) );
else MyObject const & not_altered( original );
}
可能实现你在找什么?