gpt4 book ai didi

c++ - "new std::complex"和 "fftw_malloc"哪个更安全、高效?

转载 作者:行者123 更新时间:2023-12-03 12:50:05 27 4
gpt4 key购买 nike

我正在使用一个库,该库接受用 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;

}

鉴于应避免强制转换,我们是否可以说 p2p1更安全?

最佳答案

来自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 。例如,

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);

然后你的 vector f将使用FFTW的分配函数分配和释放内存。

关于c++ - "new std::complex"和 "fftw_malloc"哪个更安全、高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40360467/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com