<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=http://email.email.llvm.org/c/eJylVUtzozgQ_jX4oooLQ_zgwMGvVDGVTVKJk8nMhRKowUqExEjCXvbXbwtM4uwmcxlKxpJa6tf3dZMp1sbezDeWeeESB83zpmoEtYC7hBvCoOASGKGGFEoIdTSES4JCwbPcC1ZuzHx32d94_vDGnX50SwtV7VQSL1znghpD0kTWjU0saGqV9oI1Oe3vai_c9rfS62S1vrtLk5vr5GabPiUPySq5TnY_yCBZ39487LbPd_fp8mq3vU_Xz8-T-ekyKuomZwEFi49mSZoWXBvrzP9Pgu70gl2NKy45rqJTdPNVPyH4FHgaNXvhalCHy4kXbgYdKOjT9GZtUBOEvHiL5WG3SZ-295iiLRmCIKent086pU94sIeqUocupsE5ZwZ_y8FOuHqzA8LA1ypP069vS8aL9-sabKPlkJS3c_PNp9j37-97kCRXVc0FlyWhpNaq1LQijXHr3zBQIgOzpiSVYuDwaCQD7S5c3JbOCG7ZPWhwXKVEKstzoJkAUoNGbCoqc5RVNc0tYQ0Qq9x5tA8GnEgVH6x3SZ35497tC_Kd2_1nB3BG9tbWxu0GVzh-NTx_vchQ6X6Mkbod_O3Tv9LlownrcrUNsx96EWiznKRP9uXx3IRq7J9YaQ03QTZZl8nP13tzG-S_ipefVfTtlatzFHZ7TNJ5XhggCIxarqTLn5JA4G-Kxdrl5bhvCZ5r8YpyW0g2MDXknArROmRcIktaAYODA7dqkBCtYyJFPBAKQpmqrQPYWCoZ1Yxg19BUt4SKUmkMvELUJOvQRU6t-0rBJSo4cgaiHZMPPFKNYATZmiGEyhjukEZINWCDwYA-ySHJ0V3XtLC2JRXu9H-7F5pClCme7GseS9qoCvClrUtET1ykHSrRXBqee-EVudWYnRYdqah-_dQy9kwvCKg40tY5gNRHCgcEDlgMxxPqLkEV_6fDwBCQjrvMqR-xOGRRGNERbfCojg_cYmviSqNratRoEX-kRokam-zECiEOw98F1toL5BjZFTemAYOTaThbRKN9PIcoj2Z0dlnMIupPopwV_oQuApoxmheX2UjQDJtH7E0xVYGEI-lU4NybbkZ_7gGPAz_A4UdBMA0mi_F0Mfen02w2D-dRni_m3qUPFeVi7PSMlS5HOu5UYk8wKBTcWPMuxG8ILyVA5zB6aLkVED-ar-rcsfidCkQAZcYx5Kg0tgf87PXN57xmRl0Icef_v5WZRsg>53689</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Use of `std::move` in libc++ leads to worsened debug performance
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vittorioromeo
</td>
</tr>
</table>
<pre>
`std::accumulate` is defined as follows in `libc++`:
```
template <class _InputIterator, class _Tp>
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
_Tp
accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
{
for (; __first != __last; ++__first)
#if _LIBCPP_STD_VER > 17
__init = _VSTD::move(__init) + *__first;
#else
__init = __init + *__first;
#endif
return __init;
}
```
When compiling a program using `std::accumulate` in debug mode, under `-Og`, there is a noticeable performance impact due to the presence of `std::move`.
- With `std::move`: https://quick-bench.com/q/h_M_AUs3pgBE3bYr82rsA1_VtjU
- Without `std::move`: https://quick-bench.com/q/ysis2b1CgIZkRsO2cqfjZm9Jkio
This performance degradation is one example of why many people (especially in the gamedev community) are not adopting standard library algorithms and modern C++ more widely.
Would it be possible to replace `std::move` calls internal to `libc++` with a cast, or some sort of compiler intrinsic? Or maybe mark `std::move` as "always inline" even without optimizations enabled?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVctyozoQ_Rq8UcWFwcb2goVfqeJWJkklzmNmQwnUxkqExEjCHubrbwtM4txJZnMpgSW11K9zup0p1sRe5BvLvHCBg-Z5XdaCWsBdwg1hsOMSGKGG7JQQ6mgIlwSFgme5FyzdiHx32V97fv_FnW60Swtl5VQSL1zlghpD0kRWtU0saGqV9oIVOe1vKy_cdLfSq2S5ur1Nk-ur5HqTPib3yTK5SrbfSS9Z3VzfbzfPt3fp4nK7uUtXz8-j6ekyKmonZwEFs49mSZruuDbWmf9Dgu50gm2FKy45ruan6KbLbkLw2eFp1OyFy14dLkdeuO51oKBL05u1Xk0Q8t1bLPfbdfq4ucMUbUgfBDk9nX3SKn3Egx1UpTq0MfXOOTP4Lno74fLNDggDX6s8Tb--LRnfvV_XYGst-6S8nZuuP8W--z7tQZJclRUXXBaEkkqrQtOS1Mat_8JAiQzM6oKUioHDo5YMtLtwcVM4I7hl96DBcZUSqSzPgWYCSAUasSmpzFFWVjS3hNVArHLn0T4YcCK1-2C9TWrkDzu3L8gTt_vPDuCM7K2tjNsNLnH8rHn-epGh0v0QI3U7-O7Tb-niwYRVsdyE2Xc9C7RZjNJH-_JwbkLV9v9YaQw3QTZaFcmP1ztzE-Q_dy8_yvk_r1ydo7DdY5LO88IAQWDUciVd_pQEAr8oFmubl-O-IXiuwSvKbSHZwFSQcypE45BxiSxoCQwODtyyRkI0jokU8UAoCGWqsg5gY6lkVDOCXUNT3RAqCqUx8BJRk6xFFzm16ioFl6jgyBmIZkg-8EjVghFka4YQKmO4Qxoh1YANBgP6JIckR3dd08LallS40__tXmgKUaZ4sqt5LGmjSsCPti4RHXGRdqhEc2l47oWX5EZjdhp0pKT69VPL2DO9IKDiSBvnAFIfKRwQOGAxHE-ouwSV_HeLgSEgHXeZUz9gccjm4ZwOLLcC4gfzFVkdFO_xEAGUGRfmUWnkOPburoLOgR_UWsQfmVWgQ3V2IpUQh_7nAkv1BXJMzCU3pgaDk0kYzeaDfTyP8mwMEz-Yzkd5Nh3PojAKZ-NxmAUsjMbRQNAMe0_sTdCzQMKRtCpw7k3WAx4HfoDDnwfBJBjNhpPZ1J9MsmgaTud5Ppt6Yx9KysXQ-TFUuhjouHUJwzEoFNxY8y7EPxBeSIDWHOqnNaZYxwdusaVzpRFSNWgdiNsA_gX4Cy-l">