Почему shrink_to_fit не является обязательным? - PullRequest
15 голосов
/ 19 апреля 2010

Состояние C ++ 0x FCD в векторной емкости 23.3.6.2:

void shrink_to_fit();

Замечания: shrink_to_fit - это необязательный запрос для уменьшения емкости () до размера (). [Примечание: запрос не является обязательным, чтобы разрешить широту для специфических для реализации оптимизаций. & ndash; конечная нота]

Какие оптимизации должны быть разрешены?

Ответы [ 3 ]

13 голосов
/ 19 апреля 2010

Это довольно напрягает, но:

Рассмотрим распределитель вектора, который может выделять память, скажем, с гранулярностью 4 КБ. Тогда было бы нецелесообразно перераспределять память, если вектор имел емкость 4096 и размер 4095, поскольку это не сохраняло бы память, но тратило бы некоторое время процессора на копирование элементов.

5 голосов
/ 19 апреля 2010

Идеи округления действительно актуальны, но скорее косвенно. Вопрос в том, «какие оптимизации должны быть разрешены». Это делает некоторые предположения о процессе стандартизации в отношении. оптимизаций. В общем, цель состоит в том, чтобы разрешить все ненаблюдаемые оптимизации, а затем некоторые - например, исключение копирования, когда не вызывается не вызывающий экземпляр ctor копии. В этом случае capacity() != size() может быть заметным эффектом оптимизации, и стандарт допускает это.

Что касается причин для добавления этой широты, я мог бы также представить себе игнорирование запроса сокращения, когда capacity() составляет всего 101% от size() - слишком малый выигрыш. Никогда не будет единой точной причины, поскольку LWG состоит из множества людей с разными точками зрения. Просто (было) достаточно консенсуса, что есть достаточные дополнительные возможности оптимизации, созданные путем предоставления этой свободы.

1 голос
/ 24 апреля 2010

Хотя это уже особенное, вектор должен выделяться в блоках размером 8. Я также знаю, что некоторые люди работают над тем, чтобы malloc возвращала «истинный размер» любых выделенных блоков, поэтому, если выделенный блок будет ввели неизбежные отходы, вместо этого вектор с пользой использует пространство.

Когда мы переходим на 64-битные ОС, объем памяти внезапно становится (известные последние слова) больше, чем кто-либо когда-либо приближается к заполнению, поэтому становится гораздо разумнее выделять большие блоки виртуальной памяти и заполнять их всякий раз, когда. Перемещение объектов обходится дорого, и на практике это пустая трата времени, поскольку мы не перемещаем вещи, потому что физическая память ограничена, просто из одного виртуального места в другое!

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