FFTW: как предотвратить нарушение правил наложения имен?

У меня есть код, который использует std::complex<double> тип.
От Руководство FFTW :

если у вас есть переменная complex<double> *x, вы можете передать его непосредственно в FFTW через reinterpret_cast<fftw_complex*>(x),

Тем не менее, когда я делаю это в моем коде:

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],
Как решить это предупреждение? Спасибо !

2

Решение

У вас есть три варианта здесь:

  • Просто создайте 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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]