【发布时间】:2011-02-04 12:42:52
【问题描述】:
我有一个 C++ 程序,它使用包含类实例的 std::list。如果我打电话给例如myList.push_back(MyClass(variable)); 它会先创建一个临时变量,然后立即将其复制到向量中,然后将临时变量删除。这几乎没有我想要的效率,而且当你需要一个深拷贝时很糟糕。
我很想拥有我的类new 的构造函数,而不必为了第二次分配我的内存并浪费运行时间而实现复制构造函数。我也不想立即从向量/列表中找到类实例,然后手动分配内存(或者做一些可怕的事情,比如在复制构造函数本身中分配内存)。
有没有办法解决这个问题(我没有使用 Visual Studio BTW)?
【问题讨论】:
-
你用的是什么编译器?我相信这种情况通常在较新的编译器中进行了优化。
-
您是否使用优化的构建执行此分析?
-
您需要使用发布版本进行测试。它可能在 DEBUG 模式下执行此操作,但在发布模式下使用 RVO(返回值优化),从而消除了副本。
-
这与 RVO 不同;我刚刚在 MSVC2008 上进行了测试,虽然发布版本确实执行了 RVO,但在这种情况下它仍然会复制,即使启用了所有优化。当我需要这样做时,我通常只使用指针容器。
-
有点题外话:Visual C++ 即使在调试版本中也执行 RVO,但这并不是真正的 RVO 场景。