Помогни ни да направим Uroci.net по - богат! Добави урок

C++ част.4 (Функции и обхват)

C++ » C++
fix3d   трудност:    видян: 42370



Локални променливи static

Желателно е даден идентификатор да се декларира като локална променлива навсякъде, където използуването му е ограничено във функция или вложен блок. Когато стойността на тази променлива трябва да остане след извикването, обаче, обикновените локални променливи не могат да бъдат използувани. Тяхната стойност ще изчезва всеки път, когато бъде напуснат обхвата й.

Този проблем може да бъде решен чрез деклариране на идентификатора като static. За всяка локална променлива static се отделя постоянна памет. Нейната стойност остава след извикването; но достъпът до нея остава ограничен в локалния й обхват. Например, ето една версия на gcd(), която проследява дълбочината на рекурсията, използувайки локална променлива static

#include <stream.h>
traceGcd( int v1, int v2 ); {
static int depth = 1;
cout << "depth #" << depth++ << "n";
if (v2 == 0 ) return v1;
return traceGcd( v2, v1%v2 );
}

Стойността, свързана със static локалната променлива depth остава след извикването на traceGcd(). Инициализация се извършва само веднъж. Следната малка програма показва изпълнението на traceGcd()

#include <stream.h>
n traceGcd(int, int);
main() {
int rslt = traceGcd( 15, 123 );
cout << "gcd of (15, 123) " < rslt << "n";
}

Когато компилираме и изпълним тази програма ще получим следния резултат

depth #1
depth #2
depth #3
depth #4
gcd of (15,123) 3



Локални променливи register

Локални променливи, които се използват често в дадена функция, могат да бъдат определени с ключовата дума register. Ако е възможно, компилаторът ще зареди променливата в някой машинен регистър. Ако не е възможно, променливата остава в паметта.

Очевидни кандидати за променливи register са индексите на масивите

for ( register int i = 0; i < sz; ++i )
ia[ i ] = i;

Формалните аргументи могат също да бъдат декларирани като променливи register

class iList {
public
int value;
iList *next;
};

int find( register iList *ptr, int val ) {
// find val in ilinked list

while ( ptr ) {
if ( ptr->value == val ) return 1;
ptr = ptr->next;
}

return 0;
}

Променливите registerмогат да увеличат скоростта на изпълнение на функцията ако избраните променливи се използват често.



Страници: «9 10 11 12

Сподели урока:



Регистрирайте се, за да добавите коментар


Калдейта Ком ЕООД - © 2003-. Всички права запазени.
Препоръчваме: IT Новини