نوشتن allocator برای وکتور - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

نوشتن allocator برای وکتور

+1 امتیاز

من میخوام برای وکتور یک allocator بنویسم که مموری align شده بر گردونه ولی نمی دونم چرا کد زیر ارور میده 

#include <iostream>
#include <vector>

template <class Tp>
struct AlignedAllocator {
	typedef Tp value_type;
	AlignedAllocator(){}
	template <class T> AlignedAllocator(const AlignedAllocator<T>& other){

	}
	Tp* allocate(std::size_t n){
		return static_cast<Tp*>(_aligned_malloc(n, 16));
	}
	void deallocate(Tp* p, std::size_t n){
		free(p);
	}
};
template <class T, class U>
bool operator==(const AlignedAllocator<T>&, const AlignedAllocator<U>&){
	return (static_cast<T>(Left) == static_cast<U>(Right));
}
template <class T, class U>
bool operator!=(const AlignedAllocator<T>& Left, const AlignedAllocator<U>& Right){
	return (static_cast<T>(Left) == static_cast<U>(Right));
}

template<class T,class Allocator=AlignedAllocator<T>>
using AlignedVector = std::vector<T, Allocator>;

int main() {
	AlignedVector<int> vec;
	vec.push_back(5);
	return 0;
}

 

سوال شده شهریور 5, 1393  بوسیله ی OptiMan (امتیاز 124)   2 9 16

1 پاسخ

+2 امتیاز
 
بهترین پاسخ
سلام .

Allocatorی که برای کلاس vector تعریف میشه و ازش استفاده میشه ، برای گرفتن حافظه ی بزرگ بکار میره .

vector هر باری که حافظه میگیره ، دقیقا نسبت به  تعداد شی هایی که شما بهش میدید نیست . بلکه میاد یک بار یه حافظه به اندازه مثلا ۸ تا شی میگیره و وقتی که اون ۸ تا پر شد میاد مثلا ۱۶ تا دیگه میگیره .

برای هر شی نمیاد از Allocator استفاده کنه ، حالا مثلا شما Allocator ی که درست میکنید حافظه رو ۱۶ بایت Align میکنه . و vector هم فقط از یک block استفاده میکنه و فقط آدرس همون block روی ۱۶ Align میشه نه هر شی ای که داخلش ذخیره میشه . توی vector اشیا پشت سر هم هستن .

شما باید خودتون برای هر شی Padding بزارید تا تا هر شی اندازش بشه ۱۶ بایت . در واقع اینکه Allocator شما حافظه رو روی ۱۶ Align کنه خیلی خیلی مهمه . چون اگه حافظه از ضریب ۱۶ شروع نشه ، بقیه شی ها هم به همین ترتیب توی ضریب نا مناسب قرار میگیرن .

پس غیر از Allocator برای اشیا هم Padding اضافه کنید ، مثلا اگر شما یک< vector<int میخواهید که هر شی ۴ بایت هست ولی میخواهید هر شی ۱۶ بایت بشه ، پس باید اندازه شی ها رو بکنید ۱۶ بایتی . مثلا جای< vector<int از < [ vector<char[16 استفاده کنید و موقع خواندن/نوشتن روی هر شی ، اون [ char[16 رو به یک int تبدیل کنید و ازش استفاده کنید .

درضمن حافظه گرفته شده با تابع aligned_malloc رو باید با aligned_free آزاد کنید .

توی اون کد هم فک نمیکنم operator هایی که تعریف کردید به دردی بخورن .
پاسخ داده شده شهریور 5, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
انتخاب شد شهریور 5, 1393 بوسیله ی OptiMan
...