如何复制 boost::aligned_storage 对象中的数据?
How data in a boost::aligned_storage object is copied?
boost::aligned_storage
数据类型对我很有用,以便在 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
的实现时,它有一个副本构造函数列为私有和一个注释// noncopyable
。在任何关于这种类型的提升页面中似乎都没有对此进行解释,所以我得出结论,他们不想处理不同可能的模板化缓冲区大小的复制。我怀疑以下内容可用于复制此缓冲区:
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](、新表达式、隐式更改联合的活动成员([class.union](或创建临时对象([conv.rval],[class.temporary](创建。
因此,在您将对象复制到带有放置新位置的store
之前,您实际上没有对象,只有存储。
假设您正在存储Foo
。 最初您会在StorageBuffer
中创建Foo
,例如
Foo* f = new(_store.address()) Foo();
因此,在复制构造函数中,您只需要调用Foo
的复制构造函数并将其放入_store
中,例如
RoutineStorage(const RoutineStorage<StoreSize>& copy)
{
f = new(_store.address()) Foo(copy.*f);
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象