Когда автор говорит, что «ссылки и указатели на ключи и значения ... должны оставаться действительными» означает ли это, что после того, как я вставлю элемент, указатель и ссылка должны жить для всей программы?
Нет.Это означает, что если вы берете адрес объекта на карте или привязываете ссылку на такой объект, этот указатель или эта ссылка не должны становиться висячими из-за добавления или удаления несвязанных элементов на карте.Это требование к реализации std::unordered_map
.
Это отличается от того, как, например, std::vector
ведет себя.Добавление элементов в вектор может привести к его перераспределению, и все ранее полученные указатели и ссылки на элементы останутся висячими.
Когда я использую new
для выделения объекта в куче и указателя наон выходит из области видимости и больше не действителен.
Нет, указатель перестает существовать, другие указатели с тем же значением все еще указывают на объект, который вы new
ed.
Как «косвенные и индивидуально выделенные« записи »увеличивают значительную нагрузку на ЦП»?
Современные ЦП намного быстрее получают доступ к объектам, которые находятся рядом в памяти.Например, они начинают загружать более поздние элементы до , о которых их просят.Такой прогноз сложнее, если целевые адреса не следуют простому шаблону.
В статье, на которую вы ссылаетесь, рассказывается о выборе дизайна, сделанном комитетом по стандартам, который делает std::unordered_map
неподходящим для целей автора.Они написали пару классов, которые имеют те же открытые члены (с теми же значениями), что и у std::unordered_map
, в качестве замены "drop in".