C ++: Разъяснение о «действительных указателях и ссылках» - PullRequest
0 голосов
/ 30 мая 2019

Мне трудно понять это описание реализации неупорядоченной карты stl :

Стандартная библиотека шаблонов (STL) для C ++ предоставляет хеш-таблицы через std :: unordered_map и std :: unordered_set. Стандарт гарантирует стабильность ссылок: ссылки и указатели на ключи и значения в хеш-таблице должны оставаться действительными до тех пор, пока соответствующий ключ не будет удален. На практике это означает, что записи должны быть косвенными и индивидуально распределенными, что добавляет значительную нагрузку на ЦП.

Два вопроса:

  1. Когда автор говорит, что «ссылки и указатели на ключи и значения ... должны оставаться в силе», означает ли это, что после того, как я вставлю элемент, указатель и ссылка должны жить для всей программы? Когда я использую «new» для размещения объекта в куче, и указатель на него выходит из области видимости и становится недействительным. Я не уверен, почему ссылка / указатель должны оставаться действительными, учитывая, что хеш-таблица имеет ссылку на объект в куче.

  2. Как «косвенные и индивидуально распределенные» записи увеличивают нагрузку на ЦП »?

1 Ответ

0 голосов
/ 31 мая 2019

Когда автор говорит, что «ссылки и указатели на ключи и значения ... должны оставаться действительными» означает ли это, что после того, как я вставлю элемент, указатель и ссылка должны жить для всей программы?

Нет.Это означает, что если вы берете адрес объекта на карте или привязываете ссылку на такой объект, этот указатель или эта ссылка не должны становиться висячими из-за добавления или удаления несвязанных элементов на карте.Это требование к реализации std::unordered_map.

Это отличается от того, как, например, std::vector ведет себя.Добавление элементов в вектор может привести к его перераспределению, и все ранее полученные указатели и ссылки на элементы останутся висячими.

Когда я использую new для выделения объекта в куче и указателя наон выходит из области видимости и больше не действителен.

Нет, указатель перестает существовать, другие указатели с тем же значением все еще указывают на объект, который вы new ed.

Как «косвенные и индивидуально выделенные« записи »увеличивают значительную нагрузку на ЦП»?

Современные ЦП намного быстрее получают доступ к объектам, которые находятся рядом в памяти.Например, они начинают загружать более поздние элементы до , о которых их просят.Такой прогноз сложнее, если целевые адреса не следуют простому шаблону.

В статье, на которую вы ссылаетесь, рассказывается о выборе дизайна, сделанном комитетом по стандартам, который делает std::unordered_map неподходящим для целей автора.Они написали пару классов, которые имеют те же открытые члены (с теми же значениями), что и у std::unordered_map, в качестве замены "drop in".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...