这reinterpret_cast可以吗?
Is this reinterpret_cast OK to do
我是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
和任何 有效的数组索引i
,reinterpret_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 中起作用,但在此之前不会。 它可能仍然适用于库的实现,但您需要检查库的实现是否没有按照第三段定义任何非静态数据成员。
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 是否可以使用gcc 3.3版修复与int*cast相关的Sun Solaris OS 5.8分段故障
- C++ const-cast 一个引用