Перепишите ваш код следующим образом:
#include <complex>
#include <fftw3.h>
int main()
{
std::complex<double> x(1,0);
fftw_complex fx;
memcpy( &fx, &x, sizeof( fftw_complex ) );
}
Каждый используемый мной компилятор оптимизирует memcpy, потому что он копирует фиксированный, то есть во время компиляции, объем данных.
Это позволяет избежать проблем с наложением указателей .
Редактировать: Вы также можете избежать проблем с наложением псевдонимов, используя объединение следующим образом:
#include <complex>
#include <fftw3.h>
int main()
{
union stdfftw
{
std::complex< double > stdc;
fftw_complex fftw;
};
std::complex<double> x(1,0);
stdfftw u;
u.stdc = x;
fftw_complex fx = u.fftw;
}
Хотя строго эти правила C99 (Не уверен в C ++) нарушены, так как чтение от другого члена объединения к написанному тоже не определено.Это работает на большинстве компиляторов, хотя.Лично я предпочитаю мой оригинальный метод.