我正在使用一个带有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;
}
鉴于应该避免施放,我们可以说p2
比p1
更安全吗?
答案 0 :(得分:0)
在http://fftw.org/fftw3_doc/SIMD-alignment-and-fftw_005fmalloc.html#SIMD-alignment-and-fftw_005fmalloc中,您应该使用FFTW的分配例程,因为它们提供了特定的对齐方式。如果不使用它们的例程(或不保证对齐),则必须使用相同的缓冲区来创建和执行计划。使用它们的例程可以实现更好的矢量化,因此可以实现更快的代码。
一种解决方案是使用FFTW ++(http://fftwpp.sf.net),它包装了FFTW for C ++,并提供了内置对齐的Array类。否则,您可以创建一个对齐的分配器类,该类将为您std::vector
提供正确的对齐方式。例如,
template<typename Tdata>
class fftw_allocator : public std::allocator<Tdata>
{
public:
template <typename U>
struct rebind { typedef fftw_allocator 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);
然后,向量f
将使用FFTW的分配函数进行分配和释放内存。