Когда предварительное вычисление значения с использованием TMP действительно полезно? - PullRequest
4 голосов
/ 06 февраля 2011

Скотт Мейерс в «Эффективном C ++» указывает на способность делать, например, Матричные операции в компиляторе как причина для реализации некоторых ваших алгоритмов в шаблонных классах / функциях. Но эти функции не могут работать с аргументами, которые определены во время выполнения, очевидно - они работают только для чисел, которые записаны в программу или в лучшем случае передаются в качестве аргументов компилятору. После компиляции программа будет использовать одно и то же выходное значение при каждом запуске. В таком случае, почему бы просто не рассчитать это значение с помощью обычной (не шаблонной) программы и просто записать его в исходную программу, где это необходимо? Это не быстрее для расчета, например. 1000 пт. FFT в компиляторе, чем в обычной программе.

Лучшее, что я могу придумать, - это если вам нужно скомпилировать разные версии вашей программы для разных клиентов, тогда TMP может сэкономить вам время. Но нужно ли это каждому на самом деле?

1 Ответ

6 голосов
/ 07 февраля 2011

Основным преимуществом TMP, когда речь идет о матричных операциях, является не возможность предварительного вычисления результата матричной операции, а скорее возможность оптимизировать сгенерированный код для выполнения фактического вычисления матрицы во время выполнения.Вы правы - очень маловероятно, что вам когда-нибудь захочется предварительно вычислить матрицу в программе, - но вполне логично хотеть оптимизировать математику во время компиляции до запуска программы.Например, рассмотрим следующий код:

 Matrix a, b, c;
 /* ... Initialize these matrices ... */
 Matrix d = a + b + c;

В этой последней строке используются некоторые перегруженные операторы для вычисления матричного выражения.Используя традиционные методы программирования C ++, это будет работать следующим образом:

  1. Вычислить b * c, возвращая временный матричный объект, содержащий копию.
  2. Вычислить a + b + c, снова возвращаявременная копия.
  3. Скопируйте результат в d.

Это медленно - нет веской причины делать здесь какие-либо копии каких-либо значений.вместо этого мы должны просто за цикл по всем индексам в матрицах и суммировать все значения, которые мы находим.Однако, используя технику TMP, называемую шаблонами выражений , можно реализовать эти операторы таким способом, который фактически выполняет эти вычисления интеллектуальным, оптимизированным способом, а не медленным стандартным способом.Я полагаю, что именно об этом семействе методов упоминал Мейерс в книге.

Наиболее известные примеры TMP - это простые программы для предварительного вычисления значений во время компиляции, но на практике это гораздо более сложные методы, подобные этим.которые на самом деле привыкают на практике.

...