Вдохновленный убедительной лекцией Херба Саттера Не 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, поэтому я хотел бы попросить улучшить этот код, чтобы сделать его более идиоматичным или эффективным?