Безопасное и быстрое БПФ

Вдохновленный убедительной лекцией Херба Саттера Не C++ твоего отца, я решил еще раз взглянуть на последнюю версию C++ с помощью Microsoft Visual Studio 2010. Меня особенно заинтересовало утверждение Херба о том, что C++ «безопасен и быстр». потому что я пишу много критически важного для производительности кода.

В качестве эталона я решил попробовать написать один и тот же простой алгоритм БПФ на разных языках.

Я придумал следующий код C++11, который использует встроенный тип complexи коллекцию vector:

#include 
#include 

using namespace std;

// Must provide type or MSVC++ barfs with "ambiguous call to overloaded function"
double pi = 4 * atan(1.0);

void fft(int sign, vector> &zs) {
    unsigned int j=0;
    // Warning about signed vs unsigned comparison
    for(unsigned int i=0; i(cos(t), sin(t));
            for(unsigned int i = m; i zi = zs.at(i), t = w * zs.at(i + j);
                zs.at(i) = zi + t;
                zs.at(i + j) = zi - t;
            }
        }
}

Обратите внимание, что эта функция работает только для n-элементные векторы, где n— целая степень двойки. Любой, кто ищет быстрый код БПФ, который работает для любого n, должен посмотреть FFTW.

Насколько я понимаю, традиционный синтаксис xs[i]из C для индексации векторане выполняет проверку границ и, следовательно, не является безопасным для памяти и может быть источник ошибок памяти, таких как недетерминированное повреждение и нарушения доступа к памяти. Поэтому вместо этого я использовал xs.at(i).

Теперь я хочу, чтобы этот код был «безопасным и быстрым», но я не эксперт по C++11, поэтому я хотел бы попросить улучшить этот код, чтобы сделать его более идиоматичным или эффективным?

14
задан Xeo 12 April 2012 в 11:01
поделиться