Шаблоны выражений C ++ - PullRequest
7 голосов
/ 08 апреля 2010

В настоящее время я использую C для численных расчетов. Я слышал, что использование C ++ Expression Templates лучше для научных вычислений. Что такое шаблоны выражений C ++ в простых терминах?

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

  2. Каким образом шаблоны выражений C ++ лучше, чем использование чистого C?

Ответы [ 3 ]

11 голосов
/ 08 апреля 2010

Что такое шаблоны выражений C ++ в простых терминах?

Шаблоны выражений - это категория метапрограммирования C ++ шаблонов, которая задерживает оценку подвыражений до тех пор, пока не станет известно полное выражение, так что могут быть применены оптимизации (особенно устранение временных).

Есть ли где-нибудь книги, в которых обсуждаются численные методы / вычисления с использованием шаблонов выражений C ++?

Я полагаю, что инопланетяне были изобретены Тоддом Велдхуйзеном, который опубликовал статью об этом 15 лет назад. (Кажется, что многие старые ссылки на него уже устарели, но в настоящее время здесь является версией этого.) Некоторые материалы об этом есть в шаблонах C ++ Дэвида Вандевурда и Николая Йосуттиса : Полное руководство .

Каким образом шаблоны выражений C ++ лучше, чем использование чистого C?

Они позволяют вам писать свой код выразительным высокоуровневым способом без потери производительности. Например,

void f(const my_array<double> a1, const my_array<double> a2) 
{ 
  my_array<double> a3 = 1.2 * a1 + a1 * a2; 
  // ..
}

можно оптимизировать вплоть до

for( my_array<double>::size_type idx=0; idx<a1.size(); ++idx ) 
  a3[idx] = 1.2*a1[idx] + a1[idx]*a2[idx]; 

что быстрее, но сложнее понять.

3 голосов
/ 08 апреля 2010

В старом добром архиве Flipcode есть хорошая статья о математике шаблонов C ++:

http://www.flipcode.com/archives/Faster_Vector_Math_Using_Templates.shtml

3 голосов
/ 08 апреля 2010

В добавление к ответу sbi, шаблоны выражений реализуют высокоуровневые оптимизации глазка с использованием шаблонов для сопоставления с образцом и синтеза.

Они также добавляют синтаксический сахар или делают ваш код более читабельным, позволяя вам указать алгоритм в терминах простых операций. Таким образом, в этом случае простота и элегантность достигаются путем оптимизации с помощью метапрограммирования. По крайней мере, если вы все делаете правильно.

...