Кажется, я мог бы использовать std::valarray<_Tp>
s для какой-то вычислительной работы (предположим, что _Tp
равно uint64_t
). К сожалению, справедливо следующее:
- мой код получает необработанные массивы -
uint64_t*
s и значение длины - - Я не могу изменить подписи/API. Хотя они
__restrict__
ed. - Конструктор std::valarray, который принимает
_Tp*
и длину, копирует весь массив. - Кажется, нет методов для установки внутренних данных
std::valarray
; он даже частный, поэтому вы не можете получить к нему доступ в подклассе.
Итак, как мне разорвать этот гордиев узел и построить valarray без копирования моих данных?
valarray
функции вам нужны? Возможно, вам лучше реализовать эту функциональность для вашего необработанного массива. - person Praetorian   schedule 23.04.2015__restrict__
)? Если это так, взгляните на это, в частности, второй ответ и комментарий Говарда Хиннанта под принятым ответом. Вы проверили сборку из оптимизированной сборки с простым битом циклаfor
И, выполняя по одному элементу за раз? Возможно, автоматический векторизатор сможет преобразовать это в SIMD-инструкции. - person Praetorian   schedule 23.04.2015for
. Мне не удалось заставить gcc использовать регистры xmm, но вам может повезти с дополнительными флагами/прагмами оптимизации. - person Praetorian   schedule 23.04.2015