Почему shrink_to_fit не имеет обязательной силы?

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

void shrink_to_fit();

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

Какие оптимизаторы предназначены для разрешения?

Ответы

Ответ 1

Это довольно напряженный процесс, но:

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

Ответ 2

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

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

Ответ 3

Пока он уже особый, vector <bool> должен выделяться в блоках размером 8. Я также знаю, что некоторые люди работают над тем, чтобы malloc возвращал "истинный размер" любых выделенных блоков, поэтому, если выделенный блок введет неизбежные отходы, вместо этого вектор с пользой использует пространство.

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