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