2016-07-10 11 views
0

Я читал некоторые статьи, и во многих из них упоминалось о шаблонах выражений, можно избежать использования временных объектов. Но никто из них не упомянул, как это делается. Насколько мне известно, из-за архитектуры архитектуры проектирования выполняются с использованием временного объекта. Например, если a, b и c являются двумя матрицами, и если мы делаем a = b+c, тогда результат b+c хранится во временном объекте, таком как temp = b+c, а затем результат копируется обратно на аналогичный a = temp.Как выражения шаблонов освобождаются от временных рядов

Но если мы используем шаблоны выражений, то эта операция сложения (+) возвращает ссылку на b и c, а затем основное вычисление происходит при вычислении оператора присваивания (=). Это простая общая концепция выражения шаблона. Но я не понимаю, как он избавляется от временных объектов. Было бы хорошо, если бы кто-то мог дать только общую идею о том, как этого временного избежать.

+1

Вы можете найти [этот ответ] (http://stackoverflow.com/a/11812468/1322972) связанный, но не дублирующий вопрос, интересный. – WhozCraig

+0

Вы по-прежнему получаете временный объект, но не конечного типа, у вас есть временная оболочка. – Jarod42

ответ

2

Возьмем пример

Vector a,b,c,d; 
a = b + c + d; 

Обычно это воплотится в нечто вроде

a = b.operator+(c.operator+(d)); 

, где каждый вызов operator+ бы проходным записей. Тем не менее, тем более естественным способом было бы перебрать все элементы сразу и сделать некоторые добавления, как

a_i = b_i + c_i + d_i 

и то, что шаблоны выражений эффективно выполнять путем вычисляя epxression только тогда, когда результат действительно необходимо.

Обратите внимание, что временный (т. Е. Промежуточный результат c+d) требуется только потому, что каждый operator+ поочередно проходит через все элементы. Когда отдельные петли объединены, больше нет необходимости в временном использовании.

Для менее любительского объяснения и более подробной информации я могу вам предложить это talk from the CppConf 2015.

 Смежные вопросы

  • Нет связанных вопросов^_^