【问题标题】:Is this reinterpret_cast OK to do这个 reinterpret_cast 可以吗
【发布时间】:2013-10-18 10:21:35
【问题描述】:

我是 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];

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

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

【问题讨论】:

  • 你说你是EE,是什么?
  • 有效吗?结果正确吗?您似乎很关心速度,但如果没有正确性,速度就毫无意义。
  • reinterpret_cast 永远不会完全正常,这是一个问题,即在您的机器上是否可以使用您的编译器。看起来你将能够摆脱它。但我会改为调查更改编译器
  • @piokuc 我想的电气工程师。
  • 与您的问题无关,但强烈提示:#define ComplexD std::complex&lt;double&gt;BAD CODE。改为这样做:typedef std::complex&lt;double&gt; ComplexD;

标签: c++ c++builder reinterpret-cast


【解决方案1】:

这是允许的。虽然这不是标准报价,但cppreference 有这样的说法:

对于任何指向复数数组元素的指针p 和任何 有效数组索引ireinterpret_cast&lt;T*&gt;(p)[2*i] 是实部 复数 p[i]reinterpret_cast&lt;T*&gt;(p)[2*i + 1] 是 复数的虚部p[i]

我会尽快从实际标准中寻找报价。

【讨论】:

  • [complex.numbers]/4。这几乎是标准报价;)
【解决方案2】:

来自here,页面底部显示:

对于任何复数 z,reinterpret_cast&lt;T(&amp;)[2]&gt;(z)[0] 是 z 的实部,reinterpret_cast&lt;T(&amp;)[2]&gt;(z)[1] 是 z 的虚部。

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

这些要求实质上将 std::complex 的三个特化中的每一个的实现限制为声明两个且仅两个非静态数据成员,类型为 value_type,具有相同的成员访问权限,包含实部和虚部,分别。

所以你正在做的事情保证可以在 C++11 中工作,但不是在那之前。它可能仍然适用于您的库的实现,但您需要检查您的库的实现是否没有根据第三段定义任何更多的非静态数据成员。

【讨论】:

  • 这些几乎完全是 26.4/p4 的引用,所以这是官方认可的。
  • 你指的是这个吗? typedef struct _C_double_complex{double _Val[2]; _C_double_complex; /* 双复数 */
  • 哇,我不知道标准批准了这一点。
  • @user5108_Dan 不,您正在寻找 C++ template &lt;class T&gt; class complex; 或类似的东西,这是您拥有的 C 结构。
  • @EricNiebler 我怀疑除非有奇怪的实现,否则它应该是可能的,但我也不知道这是否合法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多