boost type_erasure::任何移动分配可以避免吗?

问题描述 投票:0回答:1

当我像这个测试用例一样移动

boost::type_erasure::any
对象时:

#include <boost/type_erasure/any.hpp>

#include <string>

int main() {
    typedef ::boost::mpl::vector<
        boost::type_erasure::destructible<>,
        boost::type_erasure::constructible<boost::type_erasure::_self(
            boost::type_erasure::_self&&)> >
        my_concept;
    typedef boost::type_erasure::any<my_concept> my_any;

    my_any a1(std::string("Test"));
    my_any a2 = std::move(a1); // dynamic memory allocation here
}

我在

a2
内的
boost/type_erasure/constructible.hpp

的移动构造中获得了动态内存分配
template<class R, class... T>
struct constructible<R(T...)>
{
    static ::boost::type_erasure::detail::storage
    apply(T... arg)
    {
        ::boost::type_erasure::detail::storage result;
        result.data = new R(::std::forward<T>(arg)...);
        return result;
    }
};

自从我从

a1
搬来后,我希望通过使用
new
的存储空间可以避免
a1
的存储空间。然而,我未能摆脱移动时的内存分配。这种分配可以避免吗?

我可以通过设置断点看到新的被击中,它出现在我的基准测试中的更大应用程序的上下文中。

我希望不要撞到

result.data = new R(::std::forward<T>(arg)...);
。我尝试寻找一个有帮助的概念,但没有成功。

c++ boost move-semantics boost-type-erasure
1个回答
0
投票

当您从

any
移动时,任何 源都不会变空。 相反,它包含一个移出的对象。

为了实施优化,它需要变空。 而且我认为增强型擦除中不支持破坏性移动。

表达破坏性移动的困难是当前 C++ 移动/复制语义模型中的一个缺陷,因此这种缺乏并不令人惊讶。

© www.soinside.com 2019 - 2024. All rights reserved.