如何有效地将左值或右值绑定到同一引用
How to efficiently bind either an lvalue or rvalue to the same reference?
假设您有一个C++函数,它使用了(const)参数的修改版本。
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
MyObject const & altered( alter_obj( original ) );
// ...
}
由于"最重要的常量"导致临时的生存期延长,因此这项工作正常。如果alter_obj()
满足返回值优化的要求,它也相当有效,因为RVO意味着不会不必要地复制由值返回的更改对象。
如果你根本不做改动,它也会很有效:
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
);
// ...
}
然而,这种做法似乎没有我所希望的那样有效。三元运算符显然要求最后两个参数在左值/右值状态上匹配,而不仅仅是在标称类型上。这意味着,当采用false(无更改)分支时,将通过调用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 );
}
可能会实现你想要的。。。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 了解C++如何返回引用并绑定到引用
- 模板允许左值与右值引用绑定
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- C++通过绑定到引用成员而缩短临时变量寿命?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 对结构成员的临时绑定引用
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 为什么我可以在初始化引用后重新绑定引用?
- 为什么按引用传入会导致绑定引用类型错误
- 返回非常量引用会导致绑定引用错误
- 递归到迭代而不重新绑定引用
- 类型绑定引用中的限定符和 const 类型的初始值设定项中删除
- 为什么C++不允许重新绑定引用?