Аллокации при сложении valarray
От: Chorkov Россия  
Дата: 23.08.24 14:04
Оценка:
Почему в операторах над valarray не определены операции с valarray&& ?
В результате каждая оператор сложения, взывает дополнительную аллокацию/освобождение памяти, хота можно было бы обойтись
одной:
std::valarray<double> a, b, c;
...
return a+b/c;


Причем, код легко переписыватся на операторы += *= /= ... но при этом, становится нечитаемым.

Или я просто не умею его готовить?
Re: Аллокации при сложении valarray
От: LaptevVV Россия  
Дата: 23.08.24 14:27
Оценка: 8 (1)
C>Почему в операторах над valarray не определены операции с valarray&& ?
Джосаттис писал, что люди, замутившие эту библиотеку, давно покинули эту разработку.
И она остается неизменной с самого первого стандарта.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Аллокации при сложении valarray
От: andrey.desman  
Дата: 27.08.24 16:12
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Почему в операторах над valarray не определены операции с valarray&& ?


Они на expression templates написаны, так что лишних аллокаций там и нет.
*(как минимум в gcc и clang).

Конечно, даже их с помощью && можно еще соптимизировать, но это того не стоит вроде как.
Re[2]: Аллокации при сложении valarray
От: Chorkov Россия  
Дата: 28.08.24 20:18
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Здравствуйте, Chorkov, Вы писали:


C>>Почему в операторах над valarray не определены операции с valarray&& ?


AD>Они на expression templates написаны, так что лишних аллокаций там и нет.

AD>*(как минимум в gcc и clang).

AD>Конечно, даже их с помощью && можно еще соптимизировать, но это того не стоит вроде как.


Вы с eigen не путаете?

Смотрю сюда: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/valarray

    private:
      size_t _M_size;
      _Tp* __restrict__ _M_data;
  // других членов-данных - нет

...

  template<typename _Tp>
    inline _Tp&
    valarray<_Tp>::operator[](size_t __i) _GLIBCXX_NOTHROW
    {
      __glibcxx_requires_subscript(__i);
      return _M_data[__i];  // _M_data - всегда хранит фактические данные
    }

операторы возвращают valarrray по значению, а не какой-то иной тип с отложенными вычислениями.
Как сюда можно запихнуть шаблонную магию?
Re[3]: Аллокации при сложении valarray
От: andrey.desman  
Дата: 28.08.24 20:57
Оценка: +1
Здравствуйте, Chorkov, Вы писали:

C>Вы с eigen не путаете?


Нет.

C>операторы возвращают valarrray по значению, а не какой-то иной тип с отложенными вычислениями.


Легко же проверить. https://godbolt.org/z/4s9oaGzv4
Можно оператор new перегрузить и тоже проверить.
Re: Аллокации при сложении valarray
От: Vzhyk2  
Дата: 29.08.24 06:33
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Или я просто не умею его готовить?

Не, просто эта поделка-недоделка такая и давно должна быть выкинута из STL.
Для работы с матричной арифметикой есть качественные либы eigen и armadillo (они умеют юзать BLAS, LAPACK в разных из инкарнациях).
Re[3]: Аллокации при сложении valarray
От: serg_joker Украина  
Дата: 31.08.24 15:06
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Смотрю сюда: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/valarray

C>операторы возвращают valarrray по значению, а не какой-то иной тип с отложенными вычислениями.
C>Как сюда можно запихнуть шаблонную магию?

Смотреть нужно отсюда:
#define _DEFINE_BINARY_OPERATOR(_Op, _Name)                \
  template<typename _Tp>                        \
    inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>,    \
         typename __fun<_Name, _Tp>::result_type>        \
    operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w)    \
...
_DEFINE_BINARY_OPERATOR(+, __plus)
...
Re[4]: Аллокации при сложении valarray
От: Chorkov Россия  
Дата: 03.09.24 09:04
Оценка:
Здравствуйте, serg_joker, Вы писали:

_>Здравствуйте, Chorkov, Вы писали:


C>>Смотрю сюда: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/valarray

C>>операторы возвращают valarrray по значению, а не какой-то иной тип с отложенными вычислениями.
C>>Как сюда можно запихнуть шаблонную магию?

_>Смотреть нужно отсюда:

_>
_>#define _DEFINE_BINARY_OPERATOR(_Op, _Name)                \
_>  template<typename _Tp>                        \
_>    inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>,    \
_>         typename __fun<_Name, _Tp>::result_type>        \
_>    operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w)    \
_>...
_>_DEFINE_BINARY_OPERATOR(+, __plus)
_>...
_>


Только в стандарте, тип возвращаемого значения указан std::valarray<T>

https://eel.is/c++draft/valarray.binary
https://en.cppreference.com/w/cpp/numeric/valarray/operator_arith3

и msvc возвращает его честно: https://godbolt.org/z/nTnz8cT4o
Re[5]: Аллокации при сложении valarray
От: watchmaker  
Дата: 03.09.24 10:37
Оценка: +1
Здравствуйте, Chorkov, Вы писали:

C>Только в стандарте, тип возвращаемого значения указан std::valarray<T>


Всё же не совсем так. Можно возвращать что угодно, если возвращаемый тип по поведению похож на valarray. На ресурсах по твоим же ссылкам это текстом написано

C>https://eel.is/c++draft/valarray.binary


Any function returning a valarray<T> is permitted to return an object of another type, provided all the const member functions of valarray<T> are also applicable to this type.

[valarray.syn]]


C>https://en.cppreference.com/w/cpp/numeric/valarray/operator_arith3

The function can be implemented with the return type different from std::valarray.

Отредактировано 03.09.2024 10:43 watchmaker . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.