Шаблоны выражений: повышение производительности при оценке выражений?

По методике шаблонов выражений матричное выражение типа

D = A*B+sin(C)+3.;

с точки зрения производительности вычислений в значительной степени эквивалентен рукописномуfor петля.

Теперь предположим, что у меня есть следующие два выражения

D = A*B+sin(C)+3.;
F = D*E;
cout << F << "\n";

В «классической» реализации по шаблонам выражений производительность вычислений будет почти такой же, как у двухfor петли в последовательности. Это связано с тем, что выражения вычисляются сразу после= операторы встречаются.

Мой вопрос: есть ли метод (например, использование заполнителей?), Чтобы признать, что значенияD на самом деле не используются, и что представляющие интерес ценности являются единственными элементамиF, так что только выражение

F = E*(A*B+sin(C)+3.);

оценивается, и вся производительность эквивалентна производительности одногоfor цикл?

Конечно, такая гипотетическая техника также должна быть в состоянии вернуться обратно, чтобы оценить выражение

D = A*B+sin(C)+3.;

если позже в коде значенияD нужны.

Спасибо заранее за любую помощь.

РЕДАКТИРОВАТЬ: Результаты экспериментов решение, предложенное Евгением

Оригинальная инструкция:

Result D=A*B-sin(C)+3.;

Время вычислений: 32 мс

Инструкция в два этапа:

Result Intermediate=A*B;
Result D=Intermediate-sin(C)+3.;

Время вычислений: 43мс

Решение сauto:

auto&& Intermediate=A*B;
Result D=Intermediate-sin(C)+3.;

Время вычислений: 32мс.

В заключение,auto&& Позволяет восстановить исходное время вычислений в случае одной команды.

РЕДАКТИРОВАТЬ: Обобщение соответствующих ссылок, следуя предложениям Евгения

Копировать Elision

Что говорит нам авто

Универсальные ссылки на C ++ 11

C ++ Rvalue Ссылки объяснил

C ++ и последующий 2012 год: Скотт Мейерс - Универсальные ссылки на C ++ 11

Ответы на вопрос(2)

Ваш ответ на вопрос