Увод в програмирането
alpha
|
В C/C++ всяка променлива се характеризира с 3 атрибута:
Типът на променливата определя:
В следствие получава диапазон на стойсти, които променлива от даден тип може да приема.
Областта на действие зависи от това къде е дефинирана променливата.
Период на активност за една променлива - части от времето при при изпълнение на програмата, през което се съхранява последните текущи стойности на променливата.
Периодът на активност на една променлива може да бъде времето за цялостно изпълнение на програмата или времето, през което управлението се намира в областта на нейно действие.
В зависимост от периода на активност за променливата се разпределя памет на различни места. По друг начин можем да кажем, че променливата има различен клас памет.
В C/C++ има 4 класа памет.
Те се задават при дефиниране на променливата.
Общ вид:
клас_памет тип променлива;
extern не може да се задава при дефиниране.
По подразбиране външните променливи имат клас памет extern. Ако една променлива има клас памет extern, то за нея се разпределя памет в областта за статични данни. Тази област се разпределя преди да започне изпълнението на програмата и се освобождава след края на изпълнение на програмата.
Клас памет auto по подразбиране имат вътрешните и формалните параметри на функция. Променливи от този клас се наричат автоматични. За тези променливи се разпределя памет в програмния стек по време на изпълнение на програмата след влизане във функцията или блока, в който са дефинирани, когато управлението за първи пър достигне мястото на тяхната дефиниция. Поради това отначало вътрешните променлив имат произволни стойности. Период на активност на автоматичните променливи съвпада с областта им на действие, т.е. стойностите им се пазят само докато се изпълнява функцията или блокът в нея. При повторно влизане стойностите на вътрешните променливи отнов са произволни.
Обикновено компилаторите анулират параметри, за които се разпределя памет в областта на статичните данни.
Пример за дефиниране на променливи от клас auto:
auto float x; auto int i;
static
Задължително се задава явно при дефинирането на променлива. За променлива, дефинирана с клас памет static, се разпределя памет в областта за статични данни. Ако вътршна променлива се дефинира с клас памет static, то се променя нейният период на активност. Той става равен на времето за изпълнение на цялата програма.
Пример:
void f() { static int i; float z; ......... i=i+2; z=z+2; z=1; }
Какво се случва? Началната стойност на i преди изпълнението е 0; След извикване на f() :
За z е разпределено място в програмния стек. Следователно не знаем каква е стойността на z.
i получава стойност 2.
За z получаваме неопределено число.
z получава стойност 1.
Свършва изпълнението на f. Следователно паметта за z в програмния стек се освобождава, т.е. губим последната стойност на z = 1.
При следващо извикване на f i=2 първоначално.
Когато външна променлива се опише като static, то нейният период на активност няма как да бъде увеличен.
Явно записан extern, то може променливата да се ползва в други модули.
Явно записан static външна промелива, то тя не може да се ползва в други модули.
register
Register е частен случай на auto.
В централния процесор има регистри. Тази памет е най-бързата памет.
При задаване на клас register "молим" компилаторът да разпредели регистър в централния процесор.
Такъв тип памет се използва за променливи, с които често се извършват операции.