അലോക്കേറ്റർ (സി++)

സി++ പ്രോഗ്രാമിങ് ഭാഷയിലെ പ്രധാനപ്പെട്ട ഒരു ഭാഗം ആണ് എസ്.ടി.എൽ (STL) എന്ന് വിളിയ്ക്കപ്പെടുന്ന സ്റ്റാൻഡേർഡ് ടെമ്പ്ലേറ്റ് ലൈബ്രറി. ഇതിലെ ഒരു പ്രധാന ഭാഗം ആണ് അലോക്കേറ്റർ (allocator). എസ്.ടി.എൽ പ്രധാനമായും കണ്ടെയ്നർ (container) എന്നറിയപ്പെടുന്ന ഒരു കൂട്ടം ക്ലാസുകൾ (class) ആണ് ഒരു പ്രോഗ്രാമർക്ക് നൽകുന്നത്. ഇത് വെക്റ്റർ (vector) ആകാം, മാപ് (map) ആകാം അല്ലെങ്കിൽ സെറ്റ് (set) ആകാം. എന്നാൽ ഈ കണ്ടെയ്നറുകൾ കമ്പ്യൂട്ടർ മെമ്മറിയിൽ ഡാറ്റ വെയ്ക്കുമ്പോൾ അവയിലെ അംഗങ്ങളുടെ എണ്ണം കൂടുന്നതിനനുസരിച്ച് മെമ്മറിയുടെ വലിപ്പം കൂട്ടേണ്ടി വരും. ഇതിനു വേണ്ടി പല സമയത്തും ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന്റെ അടുത്ത് നിന്നും പുതുതായി മെമ്മറി എടുക്കുകയോ (allocate) ചിലപ്പോൾ തിരിച്ചു കൊടുക്കേണ്ടി വരികയോ (deallocate) വേണ്ടി വരും. എന്നാൽ ഇത്തരം മെമ്മറി ഇടപാടുകൾ ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിനെ അപേക്ഷിച്ചു മാറിക്കൊണ്ടിരിയ്ക്കും. ഇത്തരം ആശ്രിതത്വങ്ങൾ മാറ്റി മെമ്മറി ഇടപാടുകൾക്ക്‌ ഒരു ഏകീകൃത രൂപം കൊടുക്കുക എന്നുള്ളതാണ് അലോക്കേറ്ററുകളുടെ കടമ. അലക്സാണ്ടർ സ്റ്റെപ്പനോവ് ആണ് 1994'ൽ ആദ്യമായി ഈ ആശയം മുന്നോട്ടു വെച്ചത്.

## ഉപയോഗം

അലോക്കേറ്ററുകളുടെ പ്രധാന ഉപയോഗം കണ്ടെയ്നറുകളെ മെമ്മറി എങ്ങനെ കൈകാര്യം ചെയ്യാം എന്ന ചുമതലയിൽ നിന്നും ഒഴിവാക്കുക എന്നുള്ളതാണ്. കണ്ടെയ്നറുകളുടെ പ്രധാന ചുമതല അവ പേറുന്ന ഡാറ്റയെ എങ്ങനെ കാര്യക്ഷമമായി കൈകാര്യം ചെയ്യുക എന്നുള്ളതാണ്. ഉദാഹരണം : ഒരു മാപ് അതിൽ അംഗങ്ങളെ എങ്ങനെ പുതുതായി ചേർക്കാം എന്നുള്ള അൽഗോരിതത്തെ എത്ര കാര്യക്ഷമം ആക്കം എന്നുള്ളതിൽ ആണ് ശ്രദ്ധ കേന്ദ്രീകരിക്കേണ്ടത്. ഡാറ്റയ്ക്ക് ഇരിയ്ക്കാനുള്ള സ്ഥലം കണ്ടെത്തുക എന്നുള്ളതല്ല അതിന്റെ പ്രധാന ചുമതല എന്നർത്ഥം. ഡാറ്റയെ എവിടെ എങ്ങനെ വെയ്ക്കാം എന്നുള്ള ചുമതല മറ്റൊരു സഹായിയായ അലോക്കേറ്ററിന് നൽകുന്നതിലൂടെ കണ്ടെയ്നർ എഴുതുന്ന ആൾക്ക് അവയുടെ പ്രധാന ചുമതല വൃത്തിയായി ചെയ്യാൻ അവസരം കിട്ടുന്നു. 

ഇനി ഡാറ്റയെ മെമ്മറിയിൽ എവിടെ എങ്ങനെ വെയ്ക്കാം എന്നത് അലോക്കേറ്റർ എഴുതുന്ന ആൾ തീരുമാനിയ്ക്കുന്നു. പ്രധാനമായും വളരെ കാര്യക്ഷമം ആയി മെമ്മറി ഉപയോഗപ്പെടുത്തുക എന്നുള്ളതാണ് അലോക്കേറ്റർ ക്ലാസ് എഴുതുന്ന ആൾ ചെയ്യാറ്. ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന്റെ പക്കൽ നിന്നും മെമ്മറി എടുക്കാനും തിരിച്ചു കൊടുക്കാനും ന്യൂ/ഡിലീറ്റ് എന്നീ രണ്ട് നിർദ്ദേശങ്ങൾ ആണ് സി++ ഭാഷയിൽ ഉപയോഗിയ്ക്കുന്നത്. ലാംഗ്വേജ് റൺ ടൈം എന്ന ഒരു ലൈബ്രറി ആണ് ഈ പ്രക്രിയ ചെയ്യാനുള്ള കോഡ് നൽകുന്നത്. പൊതുവേ ഈ കോഡ് പ്രധാനപ്പെട്ട ചില ഉപയോഗങ്ങൾക്ക് വളരെ അനുയോജ്യമായിരിയ്‌ക്കും. ഉദാഹരണത്തിന്, കുറെ ഏറെ മെമ്മറി ഒരേ സമയം നേടിയെടുക്കാനും തിരിച്ചു കൊടുക്കാനും ഇത് കാര്യക്ഷമം ആണ്.  എന്നാൽ ഈ കോഡ് എല്ലാ അവസരങ്ങളിലും കാര്യക്ഷമം ആയി പ്രവർത്തിയ്‌ക്കണം എന്നില്ല.  ഉദാഹരണം മാപ് (map) എന്ന കണ്ടെയ്നർ പ്രവർത്തിയ്‌ക്കുമ്പോൾ ചെറിയ ചെറിയ ഒട്ടേറെ മെമ്മറി ലൊക്കേഷൻസ് എടുക്കുകയും തിരിച്ചു വെയ്ക്കുകയും വേണ്ടി വരും. ഇവിടെ ന്യൂ/ഡിലീറ്റ് നിർദ്ദേശങ്ങൾ ഉപയോഗിയ്ക്കുന്നത് മാപ്പിന്റെ പൊതുവെ ഉള്ള കാര്യക്ഷമത കുറയ്ക്കാനിടയുണ്ട്. ഇവിടെ ഇത്തരം ഉദ്ദേശത്തിനായുള്ള പ്രത്യേക അലോക്കേറ്റർ ഉപയോഗിയ്ക്കുന്നതാണ് അഭികാമ്യം. അത് പോലെ ചില അവസരങ്ങളിൽ കൂടുതൽ എളുപ്പത്തിൽ മെമ്മറി പ്രശ്നങ്ങൾ കണ്ടു പിടിയ്ക്കാനായി ചില പ്രത്യേക തരം അലോക്കേറ്റർ ഉപയോഗിയ്ക്കാറുണ്ട്. ഇത്തരം സന്ദർഭത്തിൽ കണ്ടെയ്നറിനു നൽകുന്ന മെമ്മറിയുടെ അവസാനം അധികമായുള്ള ഏതാനും ബെറ്റുകളും വെയ്ക്കുന്നു. കണ്ടെയ്നർ തന്റെ പ്രവൃത്തികൾ ചെയ്യുമ്പോൾ എന്തെങ്കിലും തെറ്റു പറ്റി അതിന് അനുവദിച്ചിട്ടുള്ള പരിധിയുടെ പുറത്തു പോയി എഴുത്തുകയാണെങ്കിൽ അത്തരം പ്രശ്നങ്ങൾ അലോക്കേറ്റർ പിന്നീട് കണ്ടുപിടിച്ചു കൊടുക്കും.

## ചുമതലകൾ

ഒരു അലോക്കേറ്റർ ക്ലാസ് താഴെപ്പറയുന്ന പ്രവൃത്തികൾ എങ്കിലും ചെയ്യണം. ഈ ക്ലാസ്സിന്റെ പേര് A എന്നും അത് T എന്ന ടൈപ്പിന് വേണ്ടി ഉള്ള അലോക്കേറ്റർ ആണെന്നും വിചാരിയ്ക്കുക.

# `A::pointer, A::const_pointer, A::reference, A::const_reference, and A::value_type` എന്നീ ടൈപ്പുകൾ നൽകണം. ഇത് സി++ ഭാഷ നൽകുന്ന ടൈപ്പുകൾക്കപ്പുറം ഒരു ഏകീകൃത രൂപം ഒരു ടൈപ്പിന്റെ പോയിന്ററുകൾക്ക്‌ നൽകാൻ ആണ്. 
# `A::size_type` എന്ന ഒരു പോസിറ്റീവ് സംഖ്യ നൽകണം. A നൽകുന്ന ഒബ്ജക്റ്റുകളിലെ ഏറ്റവും വലിയ സൈസ് എത്രയാണെന്ന് കാണിയ്ക്കാനാണിത്. 
# `A::difference_type` എന്ന ഒരു പോസിറ്റീവ് സംഖ്യ നൽകണം. 
# `A::pointer A::allocate(size_type n, A<void>::const_pointer hint = 0)` എന്ന ഒരു ഫങ്ക്ഷൻ നൽകണം. ഇതാണ് മെമ്മറി എടുക്കുന്ന ഫങ്ക്ഷൻ. 
# `A::deallocate(A::pointer p, A::size_type n)` എന്ന മെമ്മറി തിരിച്ചു കൊടുക്കുന്ന മറ്റൊരു ഫങ്ക്ഷനും വേണം 

## ഇതും കൂടി കാണുക
* സ്റ്റാൻഡേർഡ് ടെമ്പ്ലേറ്റ് ലൈബ്രറി(സി++)
* മെമ്മറി മാനേജ്‌മന്റ്

## അവലംബങ്ങൾ

## പുറംകണ്ണികൾ

*CodeGuru: Allocators (STL) .
*An introductory article "C++ Standard Allocator, An Introduction and Implementation" .
*A custom allocator implementation based on malloc

വർഗ്ഗം:സി++