- •Як описуються цілі числа?
- •Порядкове читання вводу.
- •Що робить функція-член get ()?
- •Клас string.
- •Створення структури.
- •Що робить оператор enum?
- •Як робиться перерахування значень?
- •1. Змінна і змінна показника.
- •Копіювання рядка із масиву.
- •Використання операцій new та delete.
- •13. Отримання простору пам’яті.
- •Комбіновані операції присвоювання
- •Вирази відношень
- •Аналіз умови циклу:
- •Логічні оператори.
- •Простий файловий ввід-вивід символьної інформації.
- •Деякі основні факти, що використовують cout у консольному виводі.
- •Файловий ввід.
- •Як вказати діапазон елементів у масиві?
- •Як зробити передачу адреси замість передачі самої структури?
- •Використання посилальних аргументів.
- •Аргументи, що визначаємо за замовчуванням.
- •Перевантаження функції.
- •Моделі пам’яті і простір імен - Окрема компіляція програм
- •Директива #include.
- •Об’ява структур.
- •Довгочасність існування області зберігання, області видимості та компоновки.
- •Область видимості і зв’язування.
- •Автоматична довгочасність збереження.
- •Автоматичні змінні та стек.
- •Регістрові змінні.
- •П’ять видів змінних
- •Мовне зв’язування, котре дотикається функції.
Автоматичні змінні та стек.
Оскільки кількість автоматичних змінних росте або скорочується по мірі того, як функція починає та завершує виконання, програма повинна мати можливість управляти автоматичними змінними у процесі роботи. Стандартна методика складається у виділені області пам’яті, котра використовується в якості стеку, управляючою перемащенням змінних. Стек побудований за принципом LIFO( last-in? first-out – осатаній прийшов, перший вийшов). Такий механізм спрощує передачу аргументів. Програма слідкує за станом стеку за допомогою двох показників. Один вказує на базу стеку, з котрої починається виділення області пам’яті, а другий – на вершину стека, котра є наступною вільною коміркою пам’яті. Коли здійснюється виклик функції, її автоматичні змінні додаються в стек, а показник вершини встановлюється на вільну комірку пам’яті, яка слідує за тільки що розміщеними змінними. Після завершення функції показник вершини знову приймає значення, котре він мав до виклику функції. У результаті ефективно використовується пам’ять, яка застосовувалася для зберігання змінних.
Регістрові змінні.
Ключове слово register підтримує використання локальних змінних при їх об’яві. Ключове слово register вказує компілятору, що до змінної потрібний швидкий доступ за рахунок використання регістру центрального процесору. Щоб об’явити регістрову змінну, слід перед визначенням її типу розмістити ключове слово register:
register int count_fast; //запит створення регістрової змінної
Компілятор не обов’язково повинний задовольнити запит процесора.
Наприклад, регістри можуть бути зайняті або запрошується створення типа даних, котрі не підходять для регістру.
Звичайна локальна змінна, локальна змінна, що об’явлена за допомогою ключового слова auto, і локальна змінна, що об’явлена за допомогою ключового слова register, характеризується автоматичною довгочасністю збереження локальною областю видимості і відсутності зв’язування. Наступний код ілюструє усі три випадки:
int main ()
{
short waffles; //автоматична змінна за замовчуванням
auto short pancakes; //явно вказаний автоматичний тип змінної
register int muffins; //регістрова змінна
Об’ява локальної змінної без спеціфікатора – теж саме, що і об’ява її зі спеціфікатором auto. Така змінна розміщується звичайно у стек пам’яті. Використання спеціфікатора register вказує на те, що змінна буде найчастіше застосовуватися, і компілятор може вибрати замість стека пам’яті щось інше для її зберігання, наприклад, регістр центрального процесора.
ЛЕКЦІЯ 29.
Статичність довгочасного зберігання
С++ пропонує три опції зв’язування для статистичних змінних: зовнішне зв’язування, внутрішнє зв’язування і відсутність зв’язування. Змінні, що відносяться до кожного із трьох типів зв’язування, існують на протязі усього часу виконання програми. Вони довгострокові автоматичні змінні. Оскільки кількість статистичних змінних не змінюється на протязі виконання програми, вона не потребує спеціальних механізмів, аналогічних стеку, щоб керувати ними. Компілятор резервує фіксований блок пам’яті для збереження усіх статистичних змінних і ці змінні доступні програмі на протязі її виконання. Більш того, коли статистична змінна не ініціалізовані явно, то компілятор встановлює для неї нульове значення. Елементи статистичних масивів і структур встановлюються рівними нулю за замовчуванням.
Створення трьох видів статистичних змінних.
Розглянемо створення усіх трьох видів статистичних змінних, а потім приступимо до обзору їх властивостей. Щоб створити статистичну змінну зі зовнішнім зв’язуванням, потрібно об’явити її зовні усіх блоків. Шоб створити статистичну змінну зі внутрішнім зв’язуванням, потрібно об’явити її зовні усіх блоків з використанням спеціфікатора static. Для створення статистичної змінної без зв’язування треба об’явити її всередині будь-якого блоку з вказівкою спеціфікатора static. Наступний фрагмент коду демонструє усі три випадки:
…
int global = 1000; //Статистичність довгочасністю зберігання,
//зовнішнє зв’язування
static int one_file = 50 //Статистичність довгочасності зберігання,
//внутрішне зв’язування
int main ()
{
…
}
void funct1 (int n)
{
static int count = 0; //Статистичність довгочасності зберігання,
//без зв’язування
int llama = 0;
…
}
void funct2 (int q)
{
…
}
Усі статичні змінні мають наступні дві особливості ініціалізації:
У не ініціалізованої статистичної змінної усі біти встановлені в 0.
Статистична змінна може бути ініціалізована тільки константним виразом.
Константні вирази можуть містити константи-літерали, константи типу const і enum, а також операцію sizeof. Наступний фрагмент коду ілюструє ці умови:
int x; //змінна х встановлюється в 0
int y =49; //49 – це константний вираз
int z = 2 * sizeof(int) + 1; //теж константний вираз
int m =2 * z; недопустимо, z – не константа
int main() {…}
Властивості пам’яті, котрі існували до введення поняття простору імен.
Розглянемо властивості пам’яті, котрі існували до введення поняття простору імен.
