Используется ли подсказка выделения?

я читал Почему в распределителях C ++ нет функции перераспределения? а также Можно ли создать массив в куче во время выполнения, а затем выделять больше места при необходимости?, которые четко утверждают, что перераспределение динамического массива объектов невозможно.

Однако в Стандартная библиотека C ++ Джозуттис утверждает, что это allocator, имеет функцию allocate со следующим синтаксисом

pointer allocator::allocate(size_type num, allocator<void>::pointer hint = 0)

где hint имеет значение, определяемое реализацией, которое может использоваться для повышения производительности.

Есть ли реализации, которые используют это в своих интересах?

8

Решение

Я получил значительные преимущества в производительности за время итерации для небольших скалярных типов в моем PLF :: колонии Контейнер c ++, использующий подсказки с std :: allocator в Visual Studio 2010-2013 (скорость итерации увеличена на ~ 21%), и значительно меньшие ускорения в GCC 5.1. Так что можно с уверенностью сказать, что с этими компиляторами и std :: allocator это имеет значение. Но разница будет зависеть от компилятора. Мне не известно соотношение игнорирующих намеки распределителей, наблюдающих намеки.

2

Другие решения

C ++ 11 состояний, в 20.6.9.1 члены-распределители:

4 — [ Замечания: В функции-члене контейнера адрес соседнего элемента часто является хорошим выбором для передачи hint аргумент. — конечная нота ] […] 6 — […] Использование hint не определено, но предназначено как помощь
к месту, если реализация того желает.

Выделение новых элементов рядом или рядом с существующими элементами в памяти может повысить производительность, улучшая локальность; поскольку они обычно кэшируются вместе, соседние элементы будут стремиться перемещаться вместе вверх по иерархии памяти и не будут выселять друг друга.

1

Я не уверен насчет конкретных реализаций, но учтите, что распределителю не разрешено возвращать значение указателя подсказки до его передачи deallocate, Так что это не может быть использовано в качестве примитивной операции для формирования reallocate,

Стандарт говорит, что подсказка должна быть возвращена предыдущим звонком allocate, Он говорит: «Использование [подсказка] не определено, но это
предназначен для помощи локальности. «Таким образом, если вы выделяете и освобождаете последовательность блоков одинакового размера в одном потоке, вы можете передать ранее освобожденное значение, чтобы избежать конфликта между кешами микропроцессора.

В противном случае, когда CPU B видит, что вы используете адреса памяти, все еще находящиеся в кэше CPU A (даже эта память содержит объекты, которые были уничтожены в соответствии с C ++), он должен переслать ненужные данные по шине. Лучше позволить каждому ЦПУ A и B повторно использовать свои собственные соответствующие кэшированные адреса.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector