c++ - 使用指向内部缓冲区的指针 move 语义

标签 c++ c++11 vector move-semantics

假设我有一个管理指向内部缓冲区的指针的类:

class Foo
{
  public:

  Foo();

  ...

  private:

  std::vector<unsigned char> m_buffer;
  unsigned char* m_pointer;
};

Foo::Foo()
{
  m_buffer.resize(100);
  m_pointer = &m_buffer[0];
}

现在,假设我也正确地实现了 3 条规则,包括复制内部缓冲区的复制构造函数,然后将指针重新分配给内部缓冲区的新拷贝:

Foo::Foo(const Foo& f) 
{
  m_buffer = f.m_buffer;
  m_pointer = &m_buffer[0];
}

如果我还实现了 move 语义,那么只复制指针并 move 缓冲区是否安全?

Foo::Foo(Foo&& f) : m_buffer(std::move(f.m_buffer)), m_pointer(f.m_pointer)
{ }

实际上,我知道这应该可行,因为 std::vector move 构造函数只是 move 内部指针 - 它实际上并没有重新分配任何东西,所以 m_pointer 仍然指向到一个有效的地址。但是,我不确定标准是否保证了这种行为。 std::vector move 语义是否保证不会发生重新分配,因此指向 vector 的所有指针/迭代器都是有效的?

最佳答案

我会再次执行 &m_buffer[0],只是为了让您不必问这些问题。这显然不是很直观,所以不要这样做。而且,这样做,您不会有任何损失。双赢。

Foo::Foo(Foo&& f)
   : m_buffer(std::move(f.m_buffer))
   , m_pointer(&m_buffer[0])
{}

我对它很满意,主要是因为 m_pointer 是成员 m_buffer View ,而不是严格意义上的成员.

这一切都在回避问题……为什么它在那里?不能公开一个成员函数给你&m_buffer[0]吗?

关于c++ - 使用指向内部缓冲区的指针 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17880436/

相关文章:

c++ - 如何使 MinGW 对包含的头文件名区分大小写

c++ - 为什么 std::bitset::size 是非静态的

Python的列表对象不允许索引值改变

c++ - 我可以使用 C++ 作为 Windows Phone 8 的全功能开发语言吗?

c++ - 多个文件中的常量定义

c++ - C++ 的 auto 关键字是否促进了草率的编程,或者它是否有原则性的用途?

matlab - 将函数发送到matlab函数

c++ - cpp中 "[=]"是什么意思

c++ - Noexcept 对派生类构造函数的 promise : can that be used without promising noexcept on base constructor?

c++ - 是否可以在已分配的内存上初始化 std::vector ?