【问题标题】:FFTW : how to prevent breaking aliasing rules?FFTW:如何防止破坏别名规则?
【发布时间】:2013-08-23 17:36:58
【问题描述】:

我有一个使用std::complex<double> 类型的代码。 来自FFTW Manual

如果你有一个变量complex<double> *x,你可以通过reinterpret_cast<fftw_complex*>(x)直接把它传递给FFTW。

但是,当我在我的代码中这样做时:

tmp_spectrum = reinterpret_cast<std::complex<double>*>(fftw_alloc_complex(conf.spectrumSize()));
plan_bw_temp = fftw_plan_dft_c2r_1d(conf.FFTSize(), reinterpret_cast<fftw_complex*>(tmp_spectrum), tmp_out, FFTW_ESTIMATE);

我收到dereferencing type-punned pointer might break strict-aliasing rules [-Wstrict-aliasing]。 如何解决这个警告?谢谢!

【问题讨论】:

  • 封装在禁用警告的函数中?

标签: c++ fftw strict-aliasing


【解决方案1】:

这里有三个选项:

  • 只需在需要时创建一个fftw_complexfftw_plan_dft_c2r_1d(conf.FFTSize(), fftw_complex(tmp_spectrum.real(), tmp_spectrum.imag()), tmp_out, FFTW_ESTIMATE);
  • 不要在代码中使用 C++ 语言的复杂类型,而只能使用 fftw_complex 类型。
  • 使用-fno-strict-aliasing 禁用相应翻译单元中的所有严格别名优化和强制执行。仅将警告静音是安全的,因为它可能会导致代码损坏。

【讨论】:

  • 对于 1.,不确定它是否可以工作,因为这里我有一个复杂值的数组,而不是一个。对于 2.,我不能,因为我可能会绑定其他 FFT 库而不是 fftw。所以我需要一个泛型类型。所以它给我留下了优化禁用方法......如何只为一个文件禁用它?
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2019-05-14
  • 2016-10-14
  • 1970-01-01
  • 2011-05-20
  • 2016-02-06
  • 2021-03-29
  • 1970-01-01
相关资源
最近更新 更多