当我像这个测试用例一样移动
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)...);
。我尝试寻找一个有帮助的概念,但没有成功。
当您从
any
移动时,任何 源都不会变空。 相反,它包含一个移出的对象。
为了实施优化,它需要变空。 而且我认为增强型擦除中不支持破坏性移动。
表达破坏性移动的困难是当前 C++ 移动/复制语义模型中的一个缺陷,因此这种缺乏并不令人惊讶。