什么是更安全有效的“新 std::complex”或“fftw_malloc”?

ilc*_*avo 2 c++ std fftw

我正在使用一个使用 分配指针的库fftw_malloc,但我的数据以std::complex<double>*.

分配和释放内存的最有效方法是什么?

#include <fftw3.h>
#include <iostream>

int main()
{
    std::complex<double> * p1, *p2;
    std::vector< complex<double> > v;
    int N=10;

    //Allocating memory 
    p1 = (std::complex<double> *) fftw_malloc( sizeof(std::complex<double>) * N);
    p2 = new std::complex<double>[N];
    v.reserve(N);

    //Do some stuff
    manipulate(p1);
    manipulate(p2);
    manipulate(v.data());

    //Freeing memory 
    fftw_free(p1);
    delete[] p2;

}
Run Code Online (Sandbox Code Playgroud)

鉴于应该避免强制转换,我们可以说这p2p1?

小智 5

http://fftw.org/fftw3_doc/SIMD-alignment-and-fftw_005fmalloc.html#SIMD-alignment-and-fftw_005fmalloc您应该使用 FFTW 的分配例程,因为它们提供了特定的对齐方式。如果您不使用它们的例程(或不保证对齐),那么您必须使用相同的缓冲区来创建和执行计划。使用他们的例程可以实现更好的矢量化,从而更快地编写代码。

一种解决方案是使用 FFTW++ ( http://fftwpp.sf.net ),它为 C++ 包装了 FFTW 并提供了一个内置对齐的 Array 类。否则,您可以创建一个对齐的分配器类,它将为您std::vector提供正确对齐的 s。例如,

template<typename Tdata>
class fftw_allocator : public std::allocator<Tdata>
{
public:
    template <typename U>
    struct rebind { typedef fftw_allocator<U> other; };
    Tdata* allocate(size_t n) { return (Tdata*) fftw_malloc(sizeof(Tdata) * n); }
    void deallocate(Tdata* data, std::size_t size) { fftw_free(data); }
};

std::vector<std::complex<double>, fftw_allocator<std::complex<double> > > f(n);
Run Code Online (Sandbox Code Playgroud)

然后您的向量f将使用 FFTW 的分配函数分配和释放内存。