சி++ இல் டைனமிக் மெமரி ஒதுக்கீடு

Ci Il Tainamik Memari Otukkitu



பொதுவாக, C++ நிரலாக்க மொழியில் மூலக் குறியீடுகளைப் பயன்படுத்தும் போது, ​​ஒரு கம்பைலர், தரவு சேமிப்பிற்காக நினைவகத்தை கைமுறையாக மாறிக்கு ஒதுக்குகிறது. இது நிலையான நினைவகத்தின் ஒதுக்கீடு என்று கூறப்படுகிறது. இது ஒரு நிலையான நினைவகம், அதை அறிவித்தவுடன் மாற்ற முடியாது. இந்த வகை நினைவக ஒதுக்கீட்டிற்கு, இயங்குதளமானது தரவைச் சேமிக்க அடுக்கைப் பயன்படுத்துகிறது. நிலையான ஒதுக்கீட்டில், மூலக் குறியீடு இயக்கத் தொடங்கும் முன் நினைவகம் ஒதுக்கப்படும்.

அதேசமயம், டைனமிக் நினைவக ஒதுக்கீட்டில், செயல்படுத்தல் தொடங்கும் போது நினைவகம் ஒதுக்கப்படும். இந்த நினைவகம் ரன்-டைமில் புரோகிராமரால் கைமுறையாக ஒதுக்கப்படுகிறது, இது C++ இல் ரன்-டைம் நினைவக ஒதுக்கீடு என்றும் அழைக்கப்படுகிறது. டைனமிக் நினைவகத்தின் அளவை நிரலில் எந்த நிலையிலும் மாற்றலாம், ஏனெனில் அறிவிப்பின் போது, ​​சரிசெய்யக்கூடிய அளவை நாங்கள் குறிப்பிடவில்லை. மாறிக்கு மட்டுமே மதிப்பை நேரடியாக வழங்குகிறோம்.

சாதாரண மாறிகளுக்கு நினைவக ஒதுக்கீட்டின் வேறுபாடு

சாதாரண மாறிகளில், ஒரு கம்பைலரால் ஒதுக்கப்படும் நினைவகம் தானாகவே ஒதுக்கப்பட்டு ஒதுக்கப்படும். புரோகிராமரால் நினைவகம் மாறும் வகையில் ஒதுக்கப்படும்போது, ​​மூலக் குறியீட்டை மேலும் செயல்படுத்துவதில் எந்தப் பயனும் இல்லாதபோது அவர் நினைவகத்தை அகற்ற வேண்டும் அல்லது ஒதுக்க வேண்டும். இந்தச் சூழ்நிலையில் மெமரி டீல்லோகேட் செய்யப்படாமல் புரோகிராம் நிறுத்தப்படும்போது ‘மெமரி லீக்’ ஏற்படுகிறது.







டைனமிக் ஒதுக்கீட்டிற்கான ஆபரேட்டர்கள்

C++ இல், இரண்டு ஆபரேட்டர்கள் நினைவக ஒதுக்கீடு மற்றும் டீல்லோகேஷனில் உதவுகிறார்கள்: 'புதிய' மற்றும் 'நீக்கு' அவை சிறந்த முறையில் நினைவகத்தின் ஒதுக்கீடு மற்றும் டீல்லோகேஷனுக்குப் பயன்படுத்தப்படுகின்றன.



புதிய ஆபரேட்டர்

நினைவக ஒதுக்கீட்டிற்கான தேவையை இது குறிக்கிறது. புதிய ஆபரேட்டர் நினைவகத்தை துவக்கி, போதுமான நினைவகம் இருந்தால், அந்த ஒதுக்கப்பட்ட நினைவகத்தின் முகவரியை சுட்டிக்காட்டி மாறிக்கு திருப்பித் தருகிறது.



சுட்டி பொருள் = புதிய தகவல்கள் - வகை ;

ஆபரேட்டரை நீக்கு

புதிய ஆபரேட்டரைப் போலவே, ஒதுக்கப்பட்ட நினைவகத்தை அகற்ற நீக்க ஆபரேட்டர் பயன்படுத்தப்படுகிறது. C++ இல், புரோகிராமர் இந்த ஆபரேட்டரை டீலோகேஷனுக்காகப் பயன்படுத்தலாம்.





# சுட்டி_மாறியை நீக்கு;

எடுத்துக்காட்டு 1

இந்த எடுத்துக்காட்டில், நாம் இரண்டு சுட்டிகளை அறிமுகப்படுத்துவோம்: ஒன்று முழு எண் வகை சுட்டி மற்றும் மற்றொன்று மிதவை சுட்டிக்காட்டி. சுட்டிகள் ஒரு நட்சத்திரக் குறியைப் பயன்படுத்தி துவக்கப்படுகின்றன.

# Int * pointInt;
# மிதவை * புள்ளி மிதவை;

இந்த இரண்டு அச்சுப்பொறிகளைப் பயன்படுத்துவதன் மூலம், நினைவகத்தை மாறும் வகையில் ஒதுக்குவோம்.



டைனமிக் ஒதுக்கீட்டில் சுட்டிகளின் பங்கு:
சேமிப்பக இடத்தின் நினைவகம் தொகுதிகள் வடிவில் உருவாக்கப்பட்டுள்ளது. நாம் ஒரு நிரலை இயக்கும்போதோ அல்லது ஏதேனும் ஒரு செயலைச் செய்யும்போதோ, அந்த குறிப்பிட்ட நோக்கத்திற்காக நினைவகம் ஒதுக்கப்படும். அந்த நினைவகம் ஒரு சிறப்பு முகவரியைக் கொண்டுள்ளது, இது நிரலுடன் தொடர்புடையது, அந்த நினைவகத்திற்கு எந்த செயல்முறை அல்லது நிரல் அனுமதிக்கப்படுகிறது என்பதைக் கண்டறியும். எந்த மெமரி ஸ்லாட்டும் அது எந்த முகவரிக்கு சொந்தமானதோ அந்த முகவரி மூலம் அணுகப்படும். எனவே இந்த முகவரி சுட்டிகள் மூலம் சேமிக்கப்படுகிறது. சுருக்கமாக, நினைவகத்தை அணுகுவதற்கும் அதே வழியில், எந்தவொரு பணிக்கும் நினைவகத்தின் ஒரு குறிப்பிட்ட பகுதியை ஒதுக்குவதற்கும் சுட்டிகள் தேவை. முகவரிகளைச் சேமிக்க சுட்டிகள் தேவை.

கையேடு ஒதுக்கீட்டில் நினைவகத்தின் மாறும் ஒதுக்கீட்டிற்கு 'புதிய' முக்கிய சொல் பயன்படுத்தப்படுவதால், நினைவகம் கம்பைலரால் ஒதுக்கப்படுகிறது. இயக்க நேரத்தில் நினைவகத்தை ஒதுக்க வேண்டிய அவசியமில்லை. ஆனால் டைனமிக் ஒதுக்கீடு சீரற்றதாக இருப்பதால், நாம் சுட்டிகளை அடையாளம் காண வேண்டும் மற்றும் பிணைப்பு செயல்முறைக்கு, இந்த புதிய ஆபரேட்டர் பயன்படுத்தப்படுகிறது.

# புள்ளி = புதிய எண்ணு;

இதேபோல், மிதக்கும் சுட்டிக்காட்டி அதே போல் பிணைக்கப்பட்டுள்ளது. பிணைப்பு செயல்முறைக்குப் பிறகு, எந்தவொரு செயல்பாட்டிற்கும் முன்பதிவு செய்ய விரும்பும் நினைவகத்திற்கு எந்த மதிப்பையும் ஒதுக்குவோம். சுட்டியை அறிவிப்பதன் மூலம், நினைவகத்திற்கு ஒரு குறிப்பிட்ட மதிப்பை ஒதுக்குகிறோம்.

# *pointInt = 50;

புள்ளி மிதவைகளுக்கான மிதவை மதிப்பும் அறிவிக்கப்படுகிறது. ஒதுக்கிய பிறகு மதிப்புகளைக் காட்டவும்.

நாங்கள் விவாதித்தபடி, 'புதிய' ஆபரேட்டர் ஒதுக்க பயன்படுத்தப்படுகிறது, அதே நேரத்தில் 'நீக்கு' நினைவகத்தை ஒதுக்க பயன்படுகிறது. எனவே குறியீட்டில் பணி அல்லது செயல்பாட்டை நீங்கள் முடித்தவுடன், பணிக்கு நாங்கள் ஒதுக்கிய நினைவகத்தை அகற்றுவோம்.

நினைவகத்தின் அந்த பகுதியை வேறு எந்த செயல்முறையும் பயன்படுத்திக்கொள்ளும் வகையில் ஒதுக்குவது நல்லது. இரண்டு சுட்டிகளுக்கும் இந்த ஒதுக்கீட்டைப் பயன்படுத்துவோம்.

புள்ளியை நீக்கு மிதவை ;

டெக்ஸ்ட் எடிட்டரில் குறியீட்டைச் சேமித்தவுடன், உபுண்டு டெர்மினல், கோப்பில் உள்ள மூலக் குறியீட்டை g++ கம்பைலர் மூலம் இயக்க அனுமதிக்கிறது.

$ g++ -o mem mem.c
$ ./mem

செயல்படுத்தியவுடன், நினைவகத்திற்கு ஒதுக்கப்பட்ட மதிப்புகளைக் காண்பீர்கள்.

எடுத்துக்காட்டு 2

இந்த எடுத்துக்காட்டு பயனர் தொடர்புகளின் ஈடுபாட்டைக் கொண்டுள்ளது. பயனரிடமிருந்து ஒரு மதிப்பைக் கொண்டிருக்கும் எண் மாறியை எடுத்துக்கொள்வோம். இந்தத் திட்டம் மாணவர்களின் ஜிபிஏவில் முடிவுகளைச் சேமிக்கும். அனைத்து முடிவுகளும் இயக்க நேரத்தில் சேமிக்கப்படும்.

பயனர் மாணவர்களின் எண்ணிக்கையை உள்ளிடும்போது, ​​ஒவ்வொரு எண்ணுக்கும் எதிராக நினைவகம் ஒதுக்கப்படும். ஒரு மிதவை வகை சுட்டிக்காட்டி இங்கே துவக்கப்பட்டுள்ளது, இது முடிவுகளின் நினைவக ஒதுக்கீட்டில் பயன்படுத்தப்படும்.

ஜிபிஏ தசம குறிப்பில் இருப்பதால் சுட்டியை மிதவையில் எடுத்துக்கொள்கிறோம். GPA க்கு ஒரு சுட்டி வகை வரிசையை நாங்கள் எடுத்துக்கொள்கிறோம், ஏனெனில் இது பல மாணவர்களுக்கு வழிவகுக்கும்.

Ptr = புதிய மிதவை [ ஒன்றில் ]

'புதிய' முக்கிய சொல்லைக் கொண்ட இந்த சுட்டி வரிசை நினைவகத்துடன் செயல்படுத்தலை பிணைக்கும். ஒவ்வொரு மாணவருக்கும் GPA உள்ளிடப்படும். பயனர் சேர்க்க விரும்பும் மாணவர்களின் எண்ணிக்கை எங்களுக்குத் தெரியாததால், உள்ளிடப்பட்ட எண் வரை GPA ஐ உள்ளிட ஃபார் லூப்பைப் பயன்படுத்தினோம். சுழற்சியின் ஒவ்வொரு மறுமுறையிலும், மாணவரை அடையாளம் கண்டு முடிவை உள்ளிட பயனர் விசாரிக்கப்படுகிறார். முடிவு சேமிக்கப்பட்டதும், மாணவர்களின் அனைத்து ஜிபிஏக்களையும் காட்ட மீண்டும் ஒரு லூப்பைப் பயன்படுத்துவோம். முடிவில், டைனமிக் சேமிப்பகத்தின் நோக்கம் நிறைவேறியதால், சுட்டி வகை வரிசை நீக்கப்பட்டது.

அழி [ ] ptr ;

இப்போது நாம் மேலே குறிப்பிட்ட குறியீட்டை இயக்குவோம். மாணவர்களின் எண்ணிக்கையை உள்ளிட பயனர் முதலில் கோரப்படுவார். பின்னர் ஒவ்வொரு மாணவருக்கும் ஜிபிஏ உள்ளிடப்படும்.

எடுத்துக்காட்டு 3

இந்த எடுத்துக்காட்டு வகுப்பின் பொருளுக்கு புதிய மற்றும் நீக்க ஆபரேட்டர்களைப் பயன்படுத்துகிறது. இந்த வகுப்பில் வயதைச் சேமிக்கும் முழு எண் வகையின் தனிப்பட்ட மாறி உள்ளது. வகுப்பின் பொதுப் பகுதியில், கன்ஸ்ட்ரக்டர் உருவாக்கப்பட்டது, அது வயதை '10' என்ற எண்ணாகத் தொடங்கும். கட்டமைப்பாளரில் தொடங்கப்பட்ட வயதைக் காண்பிக்கும் மற்றொரு செயல்பாடு இங்கே பயன்படுத்தப்படுகிறது.

இப்போது டைனமிக் ஒதுக்கீட்டிற்கான முக்கிய திட்டத்தை நோக்கி செல்வோம். வகுப்பின் பொருள் மாறும் வகையில் உருவாக்கப்படுகிறது.

மாணவர் * ptr = புதிய மாணவர் ( ) ;

பொருள் உருவாகும்போது, ​​கட்டமைப்பாளர் தானாகவே செயல்படுத்தப்படும். வயதைப் பெற ஒரு செயல்பாட்டு அழைப்பு செய்யப்படும். இது ptr மூலம் செய்யப்படும்.

Ptr - > வயது ( ) ;

இறுதியில், நினைவகம் வெளியிடப்படும்.

முடிவுரை

கம்பைலரால் அடையாளம் காணப்பட்ட நிலையான சேமிப்பகத்திற்குப் பதிலாக புரோகிராமரால் இயக்க நேர செயலாக்கத்தில் டைனமிக் நினைவக ஒதுக்கீடு ஒதுக்கப்படுகிறது. இந்த ஒதுக்கீடு சீரற்ற அடிப்படையில் உள்ளது மற்றும் அதைப் பயன்படுத்திய பிறகு அகற்றலாம். அதேசமயம், பெரும்பாலான சந்தர்ப்பங்களில், அகற்றப்படுவதற்கு முன், செயல்படுத்தும் செயல்முறை நிறுத்தப்படும் மற்றும் இந்த டைனமிக் ஒதுக்கீடு பின்னர் நினைவக கசிவை ஏற்படுத்துகிறது. இந்த நிகழ்வை உபுண்டு லினக்ஸ் அமைப்பில் C++ நிரலாக்க மொழியைப் பயன்படுத்தி வெவ்வேறு அணுகுமுறைகளில் செயல்படுத்தியுள்ளோம்.