gpt4 book ai didi

c++ - 如何在没有 emplace_back() 的情况下将具有昂贵 dtor 的对象添加到 vector 中

转载 作者:行者123 更新时间:2023-11-30 05:23:04 27 4
gpt4 key购买 nike

我有一个对象 RenderBuffer,它创建一个 OpenGL Buffer 作为其构造函数的一部分,并在其析构函数中销毁它。这是一项非常昂贵的手术。该对象没有默认构造函数,因此通常将其放入初始化列表或插入 vector 的后面(如果有很多):

Window::Window(Renderer & render)
: m_renderBuffer(render) // sometimes looks like this
{
m_multipleBuffer.push_back(RenderBuffer(render)) // othertimes can look like this
}

后一个带有 vector 的实例导致析构函数被调用,从而导致问题。

我正在使用 VS2010,它缺少使这项工作可行的 emplace_back()。我能做些什么?我是否应该放弃 RAII 类型的编码风格并为我的类提供一个 init(...) 方法?有没有办法让它与复制构造函数一起工作?如果有的话,仅仅使用初始化方法是否值得付出努力(每个类的移动构造函数会有很多样板)?

最佳答案

您可以简单地提供您自己的移动构造函数版本。例如,您可以提供一个带有附加“移动”标志的构造函数,当为设置了此标志的对象调用复制构造函数时,它只执行移动而不是复制。

Bjarne Stroustrup 在 his keynote 中描述了这项技术在 Going Native 2012 上,当被问及 C++ 开发人员如何在 C++11 之前实现移动时。

此外,虽然我没有使用过这个特定的库,但有 Boost.Move它模拟 C++03 编译器的移动语义。可移动类具有特殊的移动构造函数和移动赋值运算符,它们通过具有 BOOST_RV_REF(T) 参数来区分,并使用 T a(boost::move(b))T a = boost::move(b)

关于c++ - 如何在没有 emplace_back() 的情况下将具有昂贵 dtor 的对象添加到 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39354498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com