代码之家  ›  专栏  ›  技术社区  ›  Fantastic Mr Fox

如何复制boost::u存储对象中的数据?

  •  0
  • Fantastic Mr Fox  · 技术社区  · 8 年前

    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 它有一个列为private的复制构造函数和一个注释 // noncopyable

    RoutineStorage(const RoutineStorage<StoreSize>& copy)
    {
        std::memcpy(_store.address(), copy._store.address(), _store.size())
    }
    

    这会有问题吗?据我所知 aligned_buffer address 函数将给出一个连续的内存地址和 size

    1 回复  |  直到 8 年前
        1
  •  1
  •   NathanOliver    8 年前

    只是复制缓冲区就像你在

    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 使用新的placement,实际上没有对象,只有存储。

    假设您正在存储 Foo . 最初您将创建 福 存储缓冲区

    Foo* f = new(_store.address()) Foo();
    

    福 _store 喜欢

    RoutineStorage(const RoutineStorage<StoreSize>& copy)
    {
        f = new(_store.address()) Foo(copy.*f);
    }