【发布时间】:2020-01-05 01:31:13
【问题描述】:
我想调用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
);
文档说我应该通过为in 和out 参数传递别名指针来表明我希望执行就地转换。
问题:in 和 out 如何在不违反严格的别名规则的情况下使用别名?
我对 GCC 特定的扩展持开放态度(即,使用unions 进行类型双关,即使标准声明这是未定义的行为)。即使允许此扩展,联合也不能包含动态大小的数组(这在此应用程序中是必须的——我事先不知道变换长度)。有没有人有任何想法?提前致谢。
【问题讨论】:
-
您从哪里得到有问题的代码没有违反严格别名规则的印象?
-
@Nicol Bolas:我想我的问题的改写可能是:FFTW 的接口是否强制调用者调用未定义的行为?或者有没有办法解决它(除了用
-fno-strict-aliasing编译)? -
不幸的是,严格的别名规则没有官方解决方法。语言在这方面被打破了;没有办法(目前)合法地将类型别名从 UB 领域获取到实现定义的领域,缺少内联汇编或您提到的编译器特定开关。
标签: c++ gcc c++17 fftw strict-aliasing