그리고 성능면에서 이점이 있습니까? 예이 간단한 예가 RAII로 간주됩니까
는 클래스/구조체라는 arraydata을 만들고 게다가 일부 정렬 메모리를 할당 (.dataPtr 의해 제공된 포인터 비록)
arraydata X(30,20);
그리고 성능면에서 이점이 있습니까? 예이 간단한 예가 RAII로 간주됩니까
는 클래스/구조체라는 arraydata을 만들고 게다가 일부 정렬 메모리를 할당 (.dataPtr 의해 제공된 포인터 비록)
arraydata X(30,20);
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;
}
};
그때 호출
예, RAII로 간주됩니다. 자원은 생성자에서 획득되고 소멸자에서 해제됩니다.
왜 과 double*
을 모두 저장하는지 잘 모르겠지만 - double*
만 있으면 충분합니다.
또한 클래스를 복사 할 때 누출로 쉽게 이어지고 이미 해제 된 데이터가 해제되므로주의해야합니다. void*
없이
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);
여기 클래스입니다 :
어쨌든,이 또한 더 관용적이다 std::unique_ptr
및 클래스의 낙하하지 않고를 사용하여 수행 할 수 있습니다
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);
}
};
고마워, 무효 포인터에 관해서는, 글쎄, _aligned_malloc() 함수는 void 포인터 만 받아들이 기 때문이다. – user0002128
@ user1748356'double *'없이 코드를 게시했습니다. 그것이 컴파일되지 않으면 말해봐. – Pubby
두 번 캐스팅하면 _aligned_free가 제대로 작동 할 수 있습니까? btw, _aligned_free는 void 포인터로만 해제 할 수 있으므로 dataPtr을 다시 캐스팅해야하거나 적어도 그렇게 생각합니다. – user0002128
왜 당신을 free/malloc을 C++로 사용 하시겠습니까? – Cubic
@Cubic : 이것은 불행히도 정렬 된 스토리지를 얻는 유일한 방법입니다. 이것을 포장하는 다른 방법이 있습니다. –