我是一个EE,不是一个代码专家,所以请容忍我在这里。
我正在使用Embarcadero C++ Builder (XE3)。
我有一个FFT算法,它对复数进行相当数量的运算。我发现,如果我绕过Embarcadero的复杂数学库,用我自己的代码进行所有的计算,我的FFT运行速度将快4.5倍。这里显示的4个操作都需要大量的时间。
#include <dinkumware\complex>
#define ComplexD std::complex<double>
ComplexD X, Y, Z, FFTInput[1024];
double x, y;
Z = X * Y;
x = X.real();
y = X.imag();
Z = ComplexD(x,y); 用我自己的横乘代替乘法,把我的执行时间减半。然而,我关心的是我访问输入数组的真实和想象部分的方式。我是这样做的:
double *Input;
Input = reinterpret_cast<double *>(FFTInput);
// Then these statements are equivalent.
x = FFTInput[n].real();
y = FFTInput[n].imag();
x = Input[2*n];
y = Input[2*n+1];这样做再次将我的执行时间减少了一半,但我不知道这样做是否明智。我可以将输入数组改为两个双倍,而不是一个复杂的,但是我在许多程序中使用这个FFT,并且不想重写所有的东西。
这个reinterpret_cast可以吗,还是我会有内存问题?另外,是否有办法使Embarcadero复杂的数学函数运行得更快?最后,虽然这对我来说并不是很重要,但这款reinterpret_cast是否便携呢?
发布于 2013-10-10 15:38:28
这是允许的。虽然这不是一个标准的引用,但优先选择有这样的说法:
对于指向复数数组
p的元素和任何有效数组索引i的任何指针,reinterpret_cast<T*>(p)[2*i]是复数p[i]的真实部分,而reinterpret_cast<T*>(p)[2*i + 1]是复数p[i]的虚部分。
我很快就会从实际标准中寻找报价。
发布于 2013-10-10 15:39:51
在这里中,页面底部写着:
对于任意复数z,
reinterpret_cast<T(&)[2]>(z)[0]是z的实部,reinterpret_cast<T(&)[2]>(z)[1]是z的虚部。 对于指向复数数组的元素p和任何有效数组索引i的任何指针,reinterpret_cast<T*>(p)[2*i]是复数pi的实部,reinterpret_cast<T*>(p)[2*i + 1]是复数pi的虚部。(自C++11以来) 这些需求在本质上限制了std::复杂的三个专门化的实现,即声明两个且只有两个类型为value_type的非静态数据成员,具有相同的成员访问权限,这些成员访问分别包含实的和虚的组件。
因此,您所做的工作可以保证在C++11中工作,但在此之前不能这样做。它可能仍然适用于库的实现,但您需要检查库的实现是否按照第三段定义了更多的非静态数据成员。
https://stackoverflow.com/questions/19299468
复制相似问题