受到 Herb Sutter 引人入胜的演讲Not your Father's C++的启发,我决定使用 Microsoft 的 Visual Studio 2010 再看看最新版本的 C++。Herb 声称 C++ 是“安全且快速”的,我特别感兴趣,因为我写了很多性能关键代码。
作为基准,我决定尝试用多种语言编写相同的简单 FFT 算法。
我想出了以下使用内置complex
类型和vector
集合的 C++11 代码:
#include <complex>
#include <vector>
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<complex<double>> &zs) {
unsigned int j=0;
// Warning about signed vs unsigned comparison
for(unsigned int i=0; i<zs.size()-1; ++i) {
if (i < j) {
auto t = zs.at(i);
zs.at(i) = zs.at(j);
zs.at(j) = t;
}
int m=zs.size()/2;
j^=m;
while ((j & m) == 0) { m/=2; j^=m; }
}
for(unsigned int j=1; j<zs.size(); j*=2)
for(unsigned int m=0; m<j; ++m) {
auto t = pi * sign * m / j;
auto w = complex<double>(cos(t), sin(t));
for(unsigned int i = m; i<zs.size(); i+=2*j) {
complex<double> zi = zs.at(i), t = w * zs.at(i + j);
zs.at(i) = zi + t;
zs.at(i + j) = zi - t;
}
}
}
请注意,此函数仅适用于n
-element 向量,其中n
是 2 的整数幂。任何寻找适用于任何人的快速 FFT 代码的人都n
应该查看FFTW。
据我了解,xs[i]
C 中用于索引 a 的传统语法vector
不进行边界检查,因此不是内存安全的,并且可能成为内存错误的来源,例如非确定性损坏和内存访问违规。所以我xs.at(i)
改用了。
现在,我希望这段代码“安全且快速”,但我不是 C++11 专家,所以我想要求改进这段代码,使其更加惯用或高效?