这reinterpret_cast可以吗?

Is this reinterpret_cast OK to do

本文关键字:cast reinterpret      更新时间:2023-10-16

我是EE,不是代码专家,所以请耐心等待。

我正在使用Embarcadero C++ Builder(XE3(。

我有一个FFT算法,它可以对复数进行相当数量的运算。我发现,如果我绕过Embarcadero的复杂数学库,用我自己的代码进行所有计算,我的FFT的运行速度将提高约4.5倍。此处显示的 4 个操作都需要过多的时间。

#include <dinkumwarecomplex>
#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是否明智。我可以将输入数组更改为两个双精度而不是复数,但我在许多程序中使用此 FFT,并且不想重写所有内容。

这是reinterpret_cast好的,还是我有记忆问题?另外,有没有办法让 Embarcadero 复杂的数学函数运行得更快?最后,虽然它对我来说不是很重要,但这reinterpret_cast便携的吗?

这是

允许的。虽然这不是一个标准的报价,但cpppreferences是这样说的:

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

我将很快从实际标准中寻找报价。

从这里开始,它在页面底部说:

对于任何复数 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 中起作用,但在此之前不会。 它可能仍然适用于库的实现,但您需要检查库的实现是否没有按照第三段定义任何非静态数据成员。