这个reinterpret_cast操作是否可行?

7

我是一个电子工程师,不是编码专家,请见谅。

我正在使用 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];

这样做使我的执行时间再次减半,但我不知道这个reinterpret_cast是否明智。我可以将输入数组更改为两个double而不是一个复数,但我在许多程序中使用这个FFT,不想重写所有内容。

这个reinterpret_cast是否可以?还是会有内存问题?另外,有没有办法让Embarcadero的复杂数学函数运行得更快?最后,虽然对我来说并不是非常重要,但这个reinterpret_cast是否可移植?


你说你是EE,那是什么意思? - piokuc
它能工作吗?结果正确吗?你似乎非常关注速度,但是速度如果没有正确性就毫无意义。 - Daniel Daranas
reinterpret_cast 永远不是完全正确的,这取决于您的机器和编译器是否支持。看起来您可能能够使用它,但我建议您考虑更换编译器。 - n. m.
1
@piokuc 可能是电气工程师。 - Simple
1
与您的问题无关,但是一个强烈的提示:#define ComplexD std::complex<double>糟糕的代码。请改用以下方式:typedef std::complex<double> ComplexD; - Angew is no longer proud of SO
显示剩余4条评论
2个回答

5

这是允许的。虽然这不是标准引用,但cppreference有以下说法:

对于指向复数数组元素的任何指针 p 和任何有效的数组索引 i,reinterpret_cast<T*>(p)[2*i] 是复数 p[i] 的实部,reinterpret_cast<T*>(p)[2*i + 1] 是复数 p[i] 的虚部。

我很快就会找到来自实际标准的引用。


[复数]/4。这几乎是一个标准引用 ;) - dyp

2
这里可以看到,页面底部写道:
对于任何复数z,reinterpret_cast<T(&)[2]>(z)[0]是z的实部,reinterpret_cast<T(&)[2]>(z)[1]是z的虚部。
对于指向复数数组元素p的任何指针和任何有效的数组索引i,reinterpret_cast<T*>(p)[2*i]是复数p[i]的实部,reinterpret_cast<T*>(p)[2*i + 1]是复数p[i]的虚部。 (自C++11起)
这些要求基本上限制了std :: complex的三个特化中的每一个实现,只声明两个非静态数据成员,类型为value_type,并具有相同的成员访问权限,分别保存实部和虚部。
因此,在C ++11中保证可行,但在此之前不一定。它仍然可能与您的库的实现一起使用,但您需要检查您的库的实现是否按照第三段定义了更多的非静态数据成员。

这些几乎是26.4/p4的确切引用,因此它是官方认可的。 - Sebastian Redl
这是你所指的吗?typedef struct _C_double_complex{double _Val[2]; } _C_double_complex; /* 双精度复数 */ - user5108_Dan
哇,我不知道标准会这样认可。 - Eric Niebler
@user5108_Dan 不是,你要找的是 C++ 的 template <class T> class complex; 或类似的东西,而不是你现在有的 C 结构体。 - SirGuy
@EricNiebler 我怀疑除非实现方式很奇怪,否则应该是可能的,但我也不知道它是否合法。 - SirGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接