c – 使用指向内部缓冲区的指针移动语义

c – 使用指向内部缓冲区的指针移动语义,第1张

概述假设我有一个管理指向内部缓冲区指针的类: class Foo{ public: Foo(); ... private: std::vector<unsigned char> m_buffer; unsigned char* m_pointer;};Foo::Foo(){ m_buffer.resize(100); m_pointer = &m_b 假设我有一个管理指向内部缓冲区的指针的类:
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];}

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

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

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

解决方法@H_419_16@ 我再次做& m_buffer [0],只是为了让你不必问这些问题.它显然不是很直观,所以不要这样做.而且,这样做,你没有任何损失.双赢.
Foo::Foo(Foo&& f)   : m_buffer(std::move(f.m_buffer)),m_pointer(&m_buffer[0]){}

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

所有人都提出这个问题……为什么会这样?你不能公开一个成员函数给你& m_buffer [0]吗?

总结

以上是内存溢出为你收集整理的c – 使用指向内部缓冲区的指针移动语义全部内容,希望文章能够帮你解决c – 使用指向内部缓冲区的指针移动语义所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存