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;