#c #stl #containers #valarray
#c #stl #контейнеры #valarray
Вопрос:
std::valarray
Почему не поддерживаются пользовательские распределители? Как разработано его управление памятью? Используется ли new
распределитель на основе или malloc
на основе? Все остальные контейнеры обычно предоставляют возможность указать пользовательский распределитель. Скажем, std::vector
у libstdc
меня есть соответствующий параметр шаблона Allocator
, и я могу указать __gnu_cxx::__mt_alloc
его в качестве распределителя.
Ответ №1:
Почему std::valarray не поддерживает пользовательские распределители?
Потому std::valarray
что это не динамический массив (например std::vector
). Это своего рода оптимизированная версия vector для числовых вычислений, разработанная для использования SIMD и аналогичных оптимизаций.
Из документации:
std::valarray и вспомогательные классы определены как свободные от определенных форм псевдонимов, что позволяет оптимизировать операции над этими классами аналогично эффекту ключевого слова restrict в языке программирования C. Кроме того, функциям и операторам, которые принимают аргументы valarray, разрешено возвращать прокси-объекты, чтобы компилятор мог оптимизировать выражение […], избегая каких-либо временных или многократных проходов.
Как вы можете видеть, это не простой динамический массив. Это динамический массив, предназначенный для хранения числовых значений и выполнения векторизованных вычислений над ними с помощью множества оптимизаций.