常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
Const reference to extend object's life followed by const_cast, is it a good idea?
考虑以下返回大对象的函数:
std::list<SomethingBig> DoSomething()
{
std::list<SomethingBig> TheList;
//do stuff
return TheList;
}
我想得到列表,而不是它的副本。因为如果我必须复制这样的对象,性能价格是昂贵的。我知道返回值优化可能会为我解决这个问题,但依靠优化来优化坏代码并不是最好的方法(对吧?
避免复制和延长对象寿命的一种干净方法是使用常量引用(请在称其为悬空引用之前对其进行测试,因为它不是(:
const std::list<SomethingBig>& theList = DoSomething();
在C++11中,可以使用std::move
来避免复制。但是,我正在开发一个 C++03 程序,我必须这样做:
const std::list<SomethingBig>& list1 = DoSomething();
const std::list<SomethingBig>& list2 = DoSomethingElse();
现在我需要将列表拼接在一起。我唯一的方法是复制所有内容,或者const_cast
这些列表并拼接它们。有没有更好的解决方案?
只需按值返回它,由于 NRVO,它会比引用和std::move
更好,这不是"对坏代码的优化",而是一种使好代码快速工作的方法。
据我所知,NRVO 确实不能保证发生(与 RVO 相反,RVO 自 c++17 以来是必须的(,但编译器极不可能不在此处删除副本。
无论如何,依靠复制省略比使用const_cast
技巧要安全得多,而且比移动便宜。
叮当和 gcc 都用-std=c++03 -O0
来省略副本
将DoSomething...()
的界面更改为std::list<SomethingBig> & DoSomething(std::list<SomethingBig> &)
怎么样?列表对象的生存期将在 DoSomething()
和 DoSomethingElse()
之外进行控制。例如:
std::list<SomethingBig> list;
DoSomethingElse(DoSomething(list));
相关文章:
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 将C 11设置功能更改为带有转发的现代模板功能是一个好主意
- std :: tr1 :: shared_ptr throw bad_alloc,也是一个好主意
- 在构造函数中循环C++是一个好主意吗?
- 是一个哨兵 QWidget 一个好主意(以防止在创建和填充布局时出现内存泄漏)
- C++正在创建一个头来解决循环依赖关系,这是一个好主意
- 在构造函数中为另一个相同类型的对象构造对象是个好主意吗
- 如果我将所有函数都作为类的静态方法,这是一个好主意
- 使用 "-g" 标志进行生产是否是一个好主意?
- 中央Typedefs.h文件 - 这是一个好主意
- 预处理器强制一致性,这是C++中的一个好主意
- 在编译的代码中包含一个大的文本变量是个好主意吗
- 一个尝试非确定性有限状态机(c++),是静态std::map的好主意
- 有一个指向std::vector-element的指针,该指针目前还不存在,但稍后将被构造,这是个好主意吗?
- 如果一个程序的主要功能是从磁盘中读取数据,那么让它多线程是不是一个好主意?
- 通过函数指针在游戏引擎数学库中使用SIMD ~一个好主意
- 每次使用RNG时都播种一个好主意
- 为什么内联构造函数和析构函数在c++中不是一个好主意
- 数组声明在.h文件,这是一个好主意
- 通过'元组'和'tie',一个好主意