Вот одна вещь, которую я не видел явно в программировании шаблонов выражений C ++, чтобы избежать создания ненужных временных объектов (путем создания деревьев «встроенных шаблонных объектов», которые разрушаются только в операторе присваивания).Предположим, что для иллюстрации мы моделируем одномерные последовательности значений с поэлементным применением арифметических операторов, таких как +, * и т. Д. Вызываем базовый класс для полностью созданных последовательностей Seq (который содержит список двойных значений фиксированной длины дляради конкретности) и рассмотрим следующий иллюстративный псевдо-C ++ - код.
void f(Seq &a,Seq &b,Seq &c,Seq &d,Seq &e){
AType t=(a+2*b)/(a+b+c); // question is about what AType can be
Seq f=d*t;
Seq g=e*e*t;
//do something with f and g
}
, где есть перегрузки с шаблонными выражениями для + и т. д. в других местах.Для строки, определяющей t:
, я могу реализовать этот код, если я сделаю AType быть Seq, но затем я создал эту полную промежуточную переменную, когда она мне не нужна (кроме случаев, когдакак это позволяет вычисление f и g).Но, по крайней мере, он рассчитывается только один раз.
Я также могу реализовать это, сделав AType подходящим типом шаблонного выражения, чтобы полный Seq не создавался в закомментированной строке, а потреблялсякусок за куском в f и g.Но тогда то же самое вычисление, вовлеченное в создание каждого конкретного чанка, будет повторено и в f и в g.(Я полагаю, что теоретически невероятно умный компилятор мог бы понять, что одни и те же вычисления выполняются дважды, а CSE-it, но я так не думаю, и не хотел бы полагаться на оптимизатора, всегда способного определить возможности.)
Насколько я понимаю, не существует разумного переписывания кода и / или использования шаблонов, которые позволяют вычислять каждый кусок t только один раз и для tрассчитывается по частям, а не все сразу?
(я могу смутно представить, что AType мог бы быть каким-то объектом, который содержит как тип шаблона выражения, так и кэшированное значение, которое записывается после его первой оценки, но это некажется, не помогает с необходимостью синхронизировать два неявных цикла в назначениях для f и g.)
В поиске в Google, я натолкнулся на один тезис Мастера по другому предмету, который упоминает прохождение этого руководства "общийисключение подвыражений "следует избегать с помощью шаблонов выражений, но я хотел бы найти болееАвторитетное «это невозможно» или «Вот как это сделать».
Ближайший вопрос stackoverflow - Промежуточные результаты с использованием шаблонов выражений , которые, похоже, касаются проблемы именования типов, а невопрос эффективности в создании полного промежуточного звена.