gpt4 book ai didi

c++ - 在不违反严格的别名规则的情况下调用 FFTW 的就地实数到复数转换

转载 作者:可可西里 更新时间:2023-11-01 18:36:30 25 4
gpt4 key购买 nike

我想调用fftw's in-place real-to-complex transform函数,具有以下签名:

fftw_plan fftw_plan_dft_r2c_1d(
int n, // transform length
double* in, // pointer to input array
fftw_complex* out, // pointer to output array
unsigned flags // flags
);

文档说我应该表明我希望通过为 inout 参数传递别名指针来执行就地转换。


问题如何在不违反严格的别名规则的情况下inout 别名?


我对特定于 GCC 的扩展持开放态度(即,使用 union 进行类型双关,即使标准声明这是未定义的行为)。即使允许此扩展, union 也不能包含动态大小的数组(这在这个应用程序中是必须的——我事先不知道转换长度)。有人有什么想法吗?提前致谢。

最佳答案

我会挑战这个前提:不要太担心严格的别名。

创建一个double 数组并将指向它的指针传递给inreinterpret_cast 指向 fftw_complex * 的指针并将其传递给 out

从此数组中读取生成的 double(作为复数的实部和虚部对)。


是的,如果以这种方式调用,fftw_plan_dft_r2c_1d 可能会破坏引擎盖下的严格别名。

但由于它在一个单独的翻译单元中,并且调用者没有违反严格别名,您的编译器无法判断是否确实违反了严格别名。

fftw_complexessentially struct fftw_complex {double re, im;};,所以一切都应该正常工作。

为了额外的安全,您可以添加:

static_assert(sizeof(fftw_complex) == 2 * sizeof(double) && alignof(fftw_complex) <= alignof(double));

关于c++ - 在不违反严格的别名规则的情况下调用 FFTW 的就地实数到复数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57749699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com