gpt4 book ai didi

c++ - 这个简单的例子被认为是 RAII

转载 作者:行者123 更新时间:2023-11-30 00:55:00 25 4
gpt4 key购买 nike

在性能方面,是否有更好的方法来做到这一点?

例如,创建一个名为 arraydata 的类/结构,它分配一些对齐的内存供使用(通过 .dataPtr 提供的指针):

class arraydata//to allocate some memory, 
//and return a pointer to that block of memory
{
void *dataPtrV;

public:

double *dataPtr;

arraydata(int a, int b)
{
dataPtrV=_aligned_malloc(a*b*sizeof(double),32);
dataPtr=(double *)dataPtrV;
}

~arraydata()
{
_aligned_free(dataPtrV);
dataPtrV=NULL;
dataPtr=NULL;
}
};

然后调用它:

     arraydata X(30,20);

最佳答案

是的,这将被视为 RAII - 资源在构造函数中获取并在析构函数中释放。

不过我不确定为什么要同时存储 void*double* - 只有 double* 就足够了.

此外,在复制类时要格外小心,因为这很容易导致泄漏并释放已经释放的数据。

无论如何,这也可以使用 std::unique_ptr 来完成,它更惯用并且没有你的类的垮台:

struct aligned_free {
void operator()(void* p) {
_aligned_free(p);
}
};

template<typename T>
T* aligned_malloc(std::size_t size, std::size_t alignment) {
return static_cast<T*>(_aligned_malloc(size * sizeof(T), alignment));
}

std::unique_ptr<double, aligned_free> make_array_data(int a, int b) {
return std::unique_ptr<double, aligned_free>(aligned_malloc<double>(a*b, 32));
}

auto arraydata = make_array_data(30, 20);

这是没有 void* 的类:

class arraydata//to allocate some memory, 
//and return a pointer to that block of memory
{

public:

double *dataPtr;

arraydata(int a, int b)
{
dataPtr=static_cast<double*>(_aligned_malloc(a*b*sizeof(double),32));
}

~arraydata()
{
_aligned_free(dataPtr);
}
};

关于c++ - 这个简单的例子被认为是 RAII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13208131/

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