рассмотрим эту простую функцию (вид псевдокода):
template <typename Derived>
void f (const MatrixBase<Derived>& input1,
const MatrixBase<Derived>& input2,
const MatrixBase<Derived>& input3,
Vec6& output)
{
part1(output) = <an expr using the three inputs>;
part2(output) = <another expr using the three inputs>;
}
Где part1
и part2
- блочные выражения, выбирающие верхние 3 строки и нижние 3 строки output
соответственно , Я знаю, что output
- это всегда вектор-столбец с 6 коэффициентами.
Я бы хотел избежать передачи аргумента output
. Но я также хотел бы избежать возврата явного Vec6
, чтобы избежать копий временных данных.
Таким образом, я хотел бы вернуть один из тех магических объектов собственного выражения, которые хранят только ссылку на входные данные и фактически выполнять вычисления только при необходимости.
Мои вопросы:
Стоит ли это того? Учитывая, что это «маленький» 6-мерный вектор (например, в документах говорится, что с маленькими 3-векторами компиляторы обычно могут оптимизировать временные расчеты, поэтому нет смысла их избегать)
Могу ли я реализовать свой тип выражения возврата с помощью специального функтора и CWiseNullaryOp
или мне действительно нужен пользовательский тип выражения?
Спасибо
РЕДАКТИРОВАТЬ: таким образом, мы установили, что временные данные оптимизированы (см. Комментарии); который отвечает на вопрос 1 и делает 2 не релевантным.
Однако, ради любопытства и получения дополнительной информации об Эйгене, есть ли у кого-нибудь какие-либо намеки на жизнеспособный тип выражения для моей функции? (предполагая, что стоило придумать один)