Valarray и пользовательский распределитель

#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, разрешено возвращать прокси-объекты, чтобы компилятор мог оптимизировать выражение […], избегая каких-либо временных или многократных проходов.

Как вы можете видеть, это не простой динамический массив. Это динамический массив, предназначенный для хранения числовых значений и выполнения векторизованных вычислений над ними с помощью множества оптимизаций.