Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么更安全、更高效?”;新标准::复杂的“;或;fftw_malloc";?_C++_Std_Fftw - Fatal编程技术网

C++ 什么更安全、更高效?”;新标准::复杂的“;或;fftw_malloc";?

C++ 什么更安全、更高效?”;新标准::复杂的“;或;fftw_malloc";?,c++,std,fftw,C++,Std,Fftw,我使用的库接受分配给fftw\u malloc的指针,但我的数据是std::complex* 分配和释放内存最有效的方法是什么 #include <fftw3.h> #include <iostream> int main() { std::complex<double> * p1, *p2; std::vector< complex<double> > v; int N=10; //Allocati

我使用的库接受分配给
fftw\u malloc
的指针,但我的数据是
std::complex*

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

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

}
#包括
#包括
int main()
{
std::复合物*p1,*p2;
std::vectorv;
int N=10;
//分配内存
p1=(标准:复合物*)fftw_malloc(标准:复合物)*N;
p2=新标准::复合物[N];
v、 储备(N);
//做点什么
操纵(p1);
操纵(p2);
操纵(v.data());
//释放内存
无fftw_(p1);
删除[]p2;
}
考虑到应该避免强制转换,我们可以说
p2
p1
更安全吗?

您应该使用FFTW的分配例程,因为它们提供了特定的对齐方式。如果不使用它们的例程(或不保证对齐),则必须使用相同的缓冲区来创建和执行计划。使用它们的例程可以实现更好的矢量化,从而更快地编写代码

一种解决方案是使用FFTW++(),它封装C++的FFTW,并提供一个内置对齐的数组类。否则,您可以创建一个对齐的分配器类,该类将为您提供具有正确对齐方式的

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);
模板
类fftw_分配器:公共std::分配器
{
公众:
模板
结构重新绑定{typedef fftw_分配器other;};
Tdata*allocate(size_t n){return(Tdata*)fftw_malloc(sizeof(Tdata)*n);}
无效释放(Tdata*data,std::size_t size){fftw_free(data);}
};
std::向量f(n);

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

你有一个比你要问的更大的问题。该函数的工作方式类似于malloc,只分配内存。它不构造对象。您不应使用
delete[]
释放内存,而应使用
fftw\u free
释放内存。你做了一个C风格的演员是一个明确的信号,表明你正在做一些你不应该做的事情。这可能要看情况而定。你必须对它进行分析。你问一个定制的库内存管理是否比标准C++的更好。库是否允许使用其设施未分配的缓冲区?另外,您使用
fftw_malloc
但是
delete
您绝对确定它是安全的吗?哦,我建议您不要使用
new std::complex
,而是使用或。最后,阅读参考资料,它的工作方式似乎与
malloc
一样,但对分配内存的对齐有更高的要求(这就是为什么您必须将它与
fftw\u free
)匹配的原因。您调用的函数到底需要什么?它需要一个
std::complex
数组吗?它需要一些其他数据吗?可能它需要一个数组吗?您确实知道该函数吗?或者您可以简单地使用
一些向量[0]如果您的数组在编译时固定了大小(如普通数组),那么请考虑使用<代码> STD::数组< /COD>。继承<代码> STD::分配器< /代码>是不可取的。只需完成它即可。