Dinamik yaddaş

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Dinamik Yaddaşa giriş

Əvvəl yazılmış proqramların əksəriyyətində yalnız statik yaddaş ayırmalarından istifadə etdik. Bu o deməkdir ki, işləmə müddətindən əvvəl proqram üçün lazım olan yaddaş miqdarını təyin etməliyik. Statik yaddaş ayırması, proqramın icrasından əvvəl kompilyasiya vaxtında yaddaşın ayrılmasından ibarətdir.

Funksiyalarda elan edilən bütün dəyişənlər (main () daxil olmaqla) yığışdırmaq. Stack, müvəqqəti dəyişənlərin saxlandığı kompüter yaddaşının xüsusi bölgəsidir. Yığın (Sonda Sonda) (FILO) məlumat quruluşudur. Bir funksiya dəyişən elan etdikdə, bu dəyişən yığına atılır. Funksiya çıxdıqda, dəyişən yığından çıxır.

Pin

The yığın dinamik yaddaş ayrılması üçün istifadə olunan kompüter yaddaşının bir bölgəsidir. Dinamik ayırma istifadə etdiyiniz zaman, yaradılan bütün dəyişənlər yığına yığılır, Heap yaddaş avtomatik olaraq idarə olunmur. Dinamik yaddaş ayırma istifadə etdiyiniz zaman yığın yerlərdə yerləşən bir göstərici yığılmış yaddaşın bölgəsini göstərir:

Pin

Yaddaşın yığılması və ayrılması üçün xüsusi operatorlardan istifadə edilməlidir.

Niyə dinamik yaddaşdan istifadə etməliyik?

Bəzi tapşırıqlar iş vaxtında yaddaşın miqdarını təyin etmə ehtiyacına səbəb olur. Məsələn, dinamik yaddaş ayrılmasına gətirib çıxaran sadə bir tapşırıq:

İstifadəçidən element sayını daxil etməsini xahiş et.

İstifadəçidən məlumat alın.

Bütün daxil edilmiş elementləri göstərin.

Bu vəziyyətdə, proqram istifadəçi tərəfindən icraya qədər neçə element daxil ediləcəyini “bilmir”. Proqram, istifadəçi elementlərinin sayından sonra iş vaxtı giriş üçün yaddaş ayırmalıdır.

Operator yeni

Dinamik yaddaş ayırması üçün C ++ operator təklif edir yeni. Operator yeni göstəricini yeni ayrılmış yerə qaytarır. Müəyyən edilmiş bir məlumat tipinin bir elementi üçün yaddaş ayırmaq istəyirsinizsə (məlumat tipi, quruluş və ya sinif daxilində ola bilər), aşağıdakı formada yeni operatordan istifadə etməlisiniz:

new data_type;

Bir sıra üçün yaddaş ayırmaq istəyirsinizsə, başqa bir operator formasını yeni istifadə etməlisiniz:

new data_type[size_of_array];

Dinamik yaddaş bölgüsü üçün ümumi sxem iki hissədən ibarətdir:

  1. Bir göstərici elan edin.
  2. Lazımi yaddaş həcmi ayırın. 

misal

Yuxarıda təsvir olunan vəzifənin həlli:

int* arr;//pointer to int
int n;//number of elements

cout << "Please, enter the number of elements for input" << endl;
cin >> n; // get n

arr = new int[n];//allocate memory for array of int of size n

//get user’s input
cout << "Enter " << n << " elements" << endl;

//get elements in loop
for (int i = 0; i != n; ++i)
	cin >> arr[i];

cout << "You entered :" << endl;

for (int i = 0; i != n; ++i)
	cout << "arr[" << i << "] = " << arr[i] << endl;

Bu kod aşağıdakı nəticəni təmin edir:

Xahiş edirəm giriş üçün element sayını daxil edin

5

Beş element daxil edin

1

2

3

4

0

Daxil etdiniz:

arr [0] = 1

arr [1] = 2

arr [2] = 3

arr [3] = 4

arr [4] = 0

Təhlükəsizlik

Operator yeni yaddaş ayıra bilmədiyi təqdirdə, növ istisna olmaqla bad_alloc atılır. Operatorun yeni “atılmamaq” versiyasından istifadə etmək imkanı var. Bu vəziyyətdə aşağıdakı sintaksisdən istifadə etməlisiniz:

new (nothrow) data_type

Operator yeni, yaddaş ayıra bilməsə də istisna etməyəcəkdir. Sadəcə boş bir göstəricini qaytaracaq.

Bir ölçülü massivlər üçün dinamik yaddaş ayırması

Nə vaxt operator yeni bir sıra üçün yaddaş ayırmaq üçün istifadə olunur, yaddaş ardıcıl olaraq ayrılır. Əvvəlki nümunədə:

arr = new int[n];//allocate memory for array of int of size n

n ölçüsünə bərabər olan ardıcıl ölçülü yaddaş blokları int ayrılır.

Massiv elementlərinin yeri barədə məlumat əlavə etməklə sıra elementlərinin çıxışını dəyişdirməyə çalışın:

cout << "arr[" << i << "] = " << arr[i] << " location: " << &arr[i] <<  endl;

Ayrıca sisteminizdəki int ölçüsü haqqında məlumat əldə edin:
cout << "Size of int in this system is " <<sizeof(int) << endl;

Proqramın bu dəyişdirilmiş versiyasını çalışdırmağa çalışın:

Xahiş edirəm giriş üçün element sayını daxil edin

5

5 element daxil edin

1

2

3

4

5

Bu sistemdəki intin ölçüsü 4-dür

Daxil etdiniz:

arr [0] = 1 yer: 00CA86D8

arr [1] = 2 yer: 00CA86DC

arr [2] = 3 yer: 00CA86E0

arr [3] = 4 yer: 00CA86E4

arr [4] = 5 yer: 00CA86E8

 

Gördüyünüz kimi, növbəti element əvvəlki elementdən 4 bayt ölçüyə malikdir (Fərqli sistemlər üçün fərqli ola bilər). İnt ölçüsü sistemimdə 4 baytdır.

Pin

İki ölçülü massivlər üçün dinamik yaddaş bölgüsü

Tez-tez bir göstərici ilə göstəriciyə yönəldilmiş iki ölçülü bir sıra üçün yaddaş ayırmağa ehtiyac var. “C ++ massivlərindən” bildiyiniz kimi, iki ölçülü massiv bir sıra massivdir. Dinamik 2B massivi, bir sıra göstəricilərə işarədir seriallar.

Pin

İki ölçülü bir sıra üçün yaddaşını dinamik olaraq ayırmaq istəyirsinizsə, əvvəlcə göstərici üçün bir göstərici yaratmalısınız:

int** arr2D;

Bundan sonra, göstəriciləri massivlərə saxlayacaq göstəricilər seriyası üçün yaddaş ayırmalısınız.
arr2D = new int*[5];

İndi iki ölçülü massivin hər sətri üçün yaddaş ayırmaq üçün bir döngədən istifadə edin:
for (int i = 0; i != 5; ++i)
	arr2D[i] = new int[3];

Yuxarıdakı kod 5 × 3 ölçülü bir sıra üçün yaddaş ayırır.

Operator silin

Bir dəfə operator tərəfindən ayrılmış yaddaşa ehtiyacınız yoxdur yeni, buraxmalısan. Operatordan istifadə edərək bunu edə bilərsiniz sil:

silmək göstərici; tək obyekt üçün və

sil [] göstərici; bir sıra obyektlər üçün

Bu halda, bir parametr bir sıra olaraq seriala ötürülür

Məsələn, massiv üçün ayrılmış yaddaşı boşalda bilərik arr yuxarıdakı nümunədən:

delete[] arr;

2 ölçülü massivlər üçün operator silmək

İki ölçülü massiv üçün ayrılmış yaddaşı dinamik olaraq boşaltmaq istəyirsinizsə, əvvəlcə hər sətir üçün ayrılmış yaddaşı boşaltmalısınız. Bir döngədə edilə bilər:

for (int i = 0; i != 3; ++i)
	delete[] arr2D[i];

Bundan sonra göstəricilər sırasına göstəricini silin:
delete[] arr2D;

Sıfır göstərici silmək operatoruna ötürüldükdə heç bir effekt yaranmayacaq.

Crack Sistemi Dizayn Müsahibələri
Translate »