手写动作

Isa*_*aev 2 c++ memcpy move-semantics c++11

我写了一个向量类来学习移动语义。我使用移动构造函数来移动 T(注释行)。

我的问题是为什么不像在 C 中一样复制临时对象的所有字节并将临时对象的所有字节设置为零?

我知道会为临时对象调用析构函数,它可能需要一些初始化的成员才能正确析构。这就是为什么我不能改变对象的内部表示的原因。

但如果我 100% 确定我的 ~T() 没有这样的要求,这是一个很好的优化吗?

 20     void push_back(T&& val)
 21     {
 22         check_cap();
 23         //new (m_data + m_size) T(std::move(val));
 24         for(int i = 0; i < sizeof(T); ++i)
 25         {
 26             reinterpret_cast<char*> (m_data + m_size)[i] = reinterpret_cast<char*> (&val)[i];
 27             reinterpret_cast<char*> (&val)[i] = 0;
 28         }
 29         m_size++;
 30     }
Run Code Online (Sandbox Code Playgroud)

(如果与实际问题无关,请不要谈论演员表及其安全性)

(我知道这不是一个好方法,最好不要在实际项目中使用它。但我只感兴趣从效率的角度来看它有多好。)

Ted*_*gmo 6

为什么不像在 C 中一样复制临时对象的所有字节并将临时对象的所有字节设置为零?

这是一个很好的优化吗?

我想不是。这是您的手写版本和普通版本之间的快速对比clang++

在此处输入图片说明

使用g++结果时,结果是平局,因此也没有收益。

  • 挑剔的是 - 元素必须通过放置 new `new(m_data+m_size) T(std::move(val));` 插入,而不是 `operator=`。但这并没有改变基准。 (2认同)