n ℕ: O(n),o(n),Θ(n),Ω(n)

n ℕ: g(n)=O(f(n)):  n0>=0,C>0: n≥n0: |g(n)|≤ C*|f(n)|

n ℕ: g(n)=o(f(n)):  ε>0 nε >0: n≥nε: |g(n)|≤ ε*|f(n)|

n ℕ: g(n)= Θ (f(n)):  n0>=0,C0>0,C1>0: n≥n0: C0*|f(n)|≤ |g(n)|≤ C1*|f(n)|

n ℕ: g(n)= Ω (f(n)):  n0>=0,C>0: n≥n0: |g(n)|≥ C*|f(n)|

Время жизни и область видимости переменных в языке С.

Время жизни: статические, автоматические, динамические

Область видимость: локальные, глобальные, глобальные в файле.

Место хранения: стек (stack), куча (heap)

Стек: линейный кусок памяти ( 2M). Задается регистром (обращение к регистру по имени) стека. Допустимы операции:

·         положить в стек

·         получить значение на вершине стека

·         изъять из стека

Программа состоит из процессов (каждый процесс имеет своей виртуальное адресное пространство), процесс – из нитей (общее адресное пространство, диспетчиризуются по процессорному времени, у каждой нити свой стек).

Язык С:

локальные (область видимости=блок, кроме перекрытий) автоматические (рождается при входе в блок, умирает – при выходе) переменные (хранится в стеке):

{int x=1;

 int m[x];//нельзя в Microsoft, можно в gcc

 

 {float  x=2;

 }

 

}

 

локальные (область видимости=блок, кроме перекрытий) статические (хранятся в куче, рождаются при старте программы) переменные (хранится в куче):

{static int x=1;

 int m[x];//нельзя в Microsoft, можно в gcc

 

 {float  x=2;

 }

 

}

int Fun()

{static int SetFirst=1;

 if(SetFirst){… SetFirst=0;}

}

 

Статические переменные = плохой стиль

 

 

 

Пример плохого стиля (соблазнительно! ):

char *Num(int x)

{static char s[100]; sprint(s,”%d”,x);return s;}

правильно:

char *Num(int x,char *s)

{ sprint(s,”%d”,x);return s;}

Microsoft:

char * _itoa( int value, char *buffer, int radix );

char * _ltoa( long value, char *buffer, int radix );

char * _ultoa( unsigned long value, char *buffer, int radix );

char * _i64toa( long long value, char *buffer, int radix );

char * _ui64toa( unsigned long long value, char *buffer, int radix );

 

 

глобальные переменные (=статические, размещаются в куче). Определяются вне функций

 

---

int x=0;//определение

void f()

{

}

---

extern int x;//описание

---

 

глобальные в файле переменные (=статические, размещаются в куче). Определяются вне функций со словом static

static int x=0;//определение в одном файле

void f()

{

}

---

static int x=1;// определение в другом файле

---

 

динамические переменные (используется куча): malloc/free

регистр вешины стека

регистр адреса текущей команды

простой цикл выполнения программы (=нити)

1. Берется регистр  адреса текущей команды

2. Команда загружается в процессор

3. Регистр  адреса текущей команды увеличивается на размер команды (в байтах)

4. Выполняется команда.

 

goto address;

call address;

rtn;