如何复制boost :: aligned_storage对象中的数据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何复制boost :: aligned_storage对象中的数据?相关的知识,希望对你有一定的参考价值。
boost::aligned_storage
数据类型对我来说很有用,以便在pre-c ++ 11世界中提供对齐存储。我有一个包含此存储成员的类:
template <size_t StoreSize>
class RoutineStorage {
enum { ROUTINE_STORAGE_SIZE = StoreSize};
enum { BUFFER_ALIGNMENT_VALUE = 8 };
template <typename TStorageType> TStorageType& getStorageAsType()
{
BOOST_STATIC_ASSERT_MSG(boost::has_trivial_assign<TStorageType>::value &&
boost::has_trivial_copy<TStorageType>::value,
"The storage type must be trvially copyable and assignable to support this classes "
"copy|assign semantics.");
... // Checking and some other code.
return new (_store.address()) TStorageType();
}
private:
typedef boost::aligned_storage<ROUTINE_STORAGE_SIZE, BUFFER_ALIGNMENT_VALUE>
StorageBuffer;
StorageBuffer _store;
}
我想为这个类提供一个复制构造函数,但是当我查看aligned_storage
的实现时,它有一个列为private的复制构造函数和一个注释// noncopyable
。在任何关于此类型的boost页面中似乎没有对此进行解释,因此我得出结论,他们不想处理不同可能的模板化缓冲区大小的复制。我怀疑以下内容可以用于复制此缓冲区:
RoutineStorage(const RoutineStorage<StoreSize>& copy)
{
std::memcpy(_store.address(), copy._store.address(), _store.size())
}
这会有问题吗?据我所知,aligned_buffer
address
函数将给出一个继续内存地址的开始,size
将让我总是复制正确的大小。
只是像你一样复制缓冲区
RoutineStorage(const RoutineStorage<StoreSize>& copy)
{
std::memcpy(_store.address(), copy._store.address(), _store.size())
}
是不足够的。是的,您将拥有一个精确的副本,但实际上并没有您在该StorageBuffer
中创建的对象。 [intro.object]1说
C ++程序中的构造创建,销毁,引用,访问和操作对象。通过定义([basic.def]),new-expression,隐式更改union的活动成员([class.union])或创建临时对象时创建对象([conv.rval] ],[class.temporary])。
因此,在将对象复制到store
并使用placement new之前,您实际上并没有对象,只是存储。
让我们说你正在存储Foo
。最初你会在Foo
中创建StorageBuffer
Foo* f = new(_store.address()) Foo();
因此,在复制构造函数中,您只需要调用Foo
的复制构造函数并将其放入_store
中
RoutineStorage(const RoutineStorage<StoreSize>& copy)
{
f = new(_store.address()) Foo(copy.*f);
}
以上是关于如何复制boost :: aligned_storage对象中的数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用“=”操作符复制 boost python 列表或他的引用
如何在 boost::variant<T> 中存储引用而不是复制对象?