我正在使用一个使用 分配指针的库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)
鉴于应该避免强制转换,我们可以说这p2比p1?
小智 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 的分配函数分配和释放内存。