Я думаю, у меня есть проблема с алиасами.
Я использую библиотеку fftw, которая поддерживает встроенные FFT. Это означает, что я вызываю функцию fftw, интерфейс которой похож на этот:
void fftwFunction(double* input, fftw_complex* output);
где fftw_complex
является double[2]
, «На месте» означает, что input
а также output
массивы могут указывать на один и тот же физический массив. (Примечание: дает лучшую производительность.)
Теперь я использую это так:
class fftwClass
{
public:
void AllocateMemory(size_t numBytes)
{
void* allocatedMemory = fftw_malloc(numBytes); // Aligned malloc
mRealValues = reinterpret_cast<double*>(allocatedMemory);
mFourierValues = reinterpret_cast< std::complex<double>* >(allocatedMemory);
}
void DoForwardFFT()
{
// Transformation from the real to the fourier-space.
fftwFunction(mRealValues, mFourierValues);
}
void DoSomethingReal()
{
// Read and modify mRealValues
// E.g.:
mRealValues[0] = 5;
}
void DoSomethingFourier()
{
// Read and modify mFourierValues
// E.g.:
mFourierValues[0] = 5;
}
private:
double* mRealValues;
std::complex<double>* mFourierValues;
};
Последовательность вызовов может быть такой: AllocateMemory()
, DoSomethingReal()
, DoForwardFFT()
, DoSomethingFourier()
,
Мои вопросы:
mRealValues
а также mFourierValues
указывают на один и тот же массив, но имеют разные типы. Поэтому у меня есть проблема с наложением алиасов DoSomethingReal()
а также DoSomethingFourier()
не так ли?-Wall -Wextra
) ни Intel, ни компилятор Microsoft до сих пор не предупредили меня ни о какой проблеме с псевдонимами, и программа работает нормально: может ли быть тихая проблема из-за псевдонимов?Для gcc следующие компиляции без предупреждения, но решает ли это проблему?
__attribute__((__may_alias__)) double* mRealValues;
__attribute__((__may_alias__)) std::complex<double>* mFourierValues;
Примечание о приведении к std::complex
: FFTW рекомендует, и, насколько я знаю, это определенное поведение в C ++ 11. В любом случае у меня есть static_assert
на месте, чтобы проверить, что размеры соответствуют, и это не мой вопрос.
В любом случае, реальный код выглядит иначе, так как использование fftw более сложное (и, конечно, я очищаю выделенную память).
Также обратите внимание, я знаю о этот пост, но он не отвечает на мой вопрос.
Задача ещё не решена.