2013-08-23 63 views
2

我有一個使用std::complex<double>類型的代碼。 從FFTW ManualFFTW:如何防止破壞別名規則?

,如果你有一個變量 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]。 如何解決此警告?謝謝 !

+0

封裝在禁用警告的功能中? – Yakk

回答

0

你這裏有三個選項:

  • 只需創建一個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的適當翻譯單元中禁用所有嚴格別名優化和強制執行。沉默只是警告是而不是安全,因爲它可能會導致代碼損壞。
+0

對於1.,不確定它可以工作,因爲在這裏我有一個複雜的值的數組,而不是一個。 對於2.,我不能,因爲我可能綁定其他FFT庫而不是fftw。所以我需要一個泛型類型。 因此,它使我的優化禁用方法...如何禁用它只有一個文件? –