FFTW: comment éviter de briser les règles de crénelage?

J’ai un code qui utilise le type std::complex . Du manuel de FFTW :

si vous avez une variable complex *x , vous pouvez la transmettre directement à FFTW via reinterpret_cast(x) .

Cependant, quand je le fais dans mon code:

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

dereferencing type-punned pointer might break ssortingct-aliasing rules [-Wssortingct-aliasing] . Comment résoudre cet avertissement? Merci !

Vous avez trois options ici:

  • Créez simplement un fftw_complex quand vous en avez besoin: fftw_plan_dft_c2r_1d(conf.FFTSize(), fftw_complex(tmp_spectrum.real(), tmp_spectrum.imag()), tmp_out, FFTW_ESTIMATE);
  • N’utilisez pas le type complexe du langage C ++ dans votre code et utilisez uniquement le type fftw_complex .
  • Désactivez TOUTES les optimisations et l’application ssortingctes des alias dans l’unité de traduction appropriée avec -fno-ssortingct-aliasing . Ne faire taire que l’avertissement n’est pas sûr, car cela pourrait entraîner un code erroné.