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

但是,当我在代码中执行此操作时:

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]
如何解决此警告?谢谢 !

最佳答案

您在这里有三个选择:

  • 只需在需要时创建一个fftw_complex:fftw_plan_dft_c2r_1d(conf.FFTSize(), fftw_complex(tmp_spectrum.real(), tmp_spectrum.imag()), tmp_out, FFTW_ESTIMATE);
  • 不要在代码中使用C++语言的复杂类型,而只能使用fftw_complex类型。
  • 使用-fno-strict-aliasing在适当的翻译单元中禁用所有严格别名优化和实现。仅使警告静默是不安全的,因为它可能会导致代码损坏。
  • 关于c++ - FFTW:如何防止违反混叠规则?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18408673/

    10-11 03:34