производительность emplace хуже проверки с последующей emplace

у меня естьstd::unordered_map стип ценности это не имеет конструктор по умолчанию, поэтому я не могу сделать следующее

auto k = get_key();
auto& v = my_map[k];

В итоге я написал вспомогательную функцию

value_type& get_value(key_type& key)
{
    return std::get<0>(my_map.emplace(
                              std::piecewise_construct,
                              std::forward_as_tuple(key),
                              std::forward_as_tuple(args_to_construct_value)
                      ))->second;
}

но производительность была заметно хуже (т.е. конструктор value_type обнаружился в perf), чем следующая версия.

value_type& get_value(key_type& key)
{
    auto it = my_map.find(key);
    if (it == my_map.end())
        return std::get<0>(my_map.emplace(
                                  std::piecewise_construct,
                                  std::forward_as_tuple(key),
                                  std::forward_as_tuple(args_to_construct_value)
                          ))->second;
    else
        return it->second;
}

Я читаю изstd :: unordered_map :: emplace создание объекта это emplace должно создать объект, чтобы увидеть, существует ли он. Но emplace проверяет, существует ли эта пара значений ключа на карте, прежде чем она вернется.

Я использую emplace неправильный путь? Есть ли лучший шаблон, которому я должен следовать:

Не будет конструировать мой value_type при каждом поиске (как в моем первом методе)Не буду проверять, существует ли значение value_type на моей карте дважды (как во втором методе)

Спасибо

Ответы на вопрос(3)

Ваш ответ на вопрос