我现在也是越来越倾向于用值而不是引用。
尤其是lambda+异步编程满天飞的时候。确保生命周期即使自己能做到,其他维护人员也不见得能做到。
而且现在编译器的copy elision和move语义都越来越普及。
导致的copy性能损失也没有那么严重。
最近又跳了一个坑,是coroutine的,分享在这里。
以后有co_xxxx关键字的地方也不敢乱用用引用语义了。
// a reference before and after a coroutine switch can become dangling
// following code is bad:
//
// for(const auto &[uid, coLoc]: p->m_inViewCOList){
// if((uid != p->masterUID()) && (co_await fnNeedHeal(p, uid).to_awaiter<bool>())){
// co_return uid;
// }
// }
//
// either the reference to [uid, coLoc] can be released because of co_await
// or the p->m_inViewCOList itself can be change which makes the range-based-loop invalid
【 在 finlab 的大作中提到: 】
: 使用值语义,可以避免大量堆管理开销和程序员的内存管理负担,可以使复杂对象的内存布局更高效,但是也带来和很多问题。
: 值语义需要定义拷贝和赋值的行为,增加了编程工作量和引入bug的概率。
:
: ...................
--
FROM 73.63.209.*