Этот простой пример рассматривается как RAII?

И с точки зрения производительности, есть ли лучшие способы сделать это?

например, создайте класс / структуру с именем 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);

1

Решение

Да, это будет считаться 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);
}
};
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]