手写动作

我写了一个向量类来学习移动语义。我使用移动构造函数来移动 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     }

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

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

回答

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

这是一个很好的优化吗?

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

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

  • To nitpick - the element must be inserted via placement new `new(m_data+m_size) T(std::move(val));`, not `operator=`. But it does not change the benchmark.

以上是手写动作的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>