Глядя на этот интересный доклад:
CppCon 2017: Мэтт Кулукундис «Разработка быстрой, эффективной и удобной для кэширования таблицы хэширования, шаг за шагом»
Оноколо минуты 38:32 упоминается, что
void Benchmark_Slow(int iters) {
std::unordered_map<string, int> m;
std::pair<const string, int> p = {};
while (iters--) m.insert(p)
}
примерно в 2 раза медленнее, чем следующий вариант
void Benchmark_Fast(int iters) {
std::unordered_map<string, int> m;
const std::pair<const string, int> p = {};
while (iters--) m.insert(p)
}
Я все еще думаю о том, почему будет выбрана перегрузка &&
(1).
std::pair<iterator,bool> insert( value_type&& value ); (1)
std::pair<iterator,bool> insert( const value_type& value ); (3)
, где value_type
равно std::pair<const Key, T>
.
В конце концов, мы не перемещаем значения, поэтому в моем понимании выражение p
должно быть lvalue, а не x / prvalue, верно?Может ли кто-нибудь просветить меня?