система выделяет ей область в оперативной памяти. В этой области среди прочего располагается стек. • Стек вызовов — это структура, хранящая локальную информацию исполняемой функции, а также информацию для возврата управления из подпрограмм (функций) в программу или подпрограмму. • LIFO — «last in first out». • Максимальный размер стека всегда ограничен. Может быть 4 Мб (для Windows обычно 1 МБ). данные функции 1 данные функции 2 данные функции 3 данные функции 4 данные функции 5 данные функции 6
Данные функции 1 Данные функции 2 Данные функции 1 Данные функции 2 Данные функции 1 Данные функции 2 Данные функции 3 x = 4 str = “Слава СССР” bin = true … Призрак функции 3 x = 4 str = “Слава СССР bin = true … Данные функции 4 y = 4 b = “Слава СССР” d = true …
одном кадре стека (stack frame) • В одном кадре стека содержатся локальные переменные функции, значения регистров процессора, которые надо будет восстановить после выполнения следующей вызываемой функции, адрес инструкции, которая будет выполнена после возврата из функции, резервируется место для возвращаемого значения вызываемой функции, промежуточные значения при вычислении сложных выражений тоже хранятся на стеке • На самом деле, всё зависит от конкретной архитектуры, но примерно так реализовано Локальные переменные функции Аргументы вызова следующей функции Место возвращаемого значения следующей функции Адрес возврата Регистры процессора Frame pointer Stack pointer Локальные переменные функции Frame pointer Stack pointer
очень ограничен в объёме, при вызове слишком большого числа вложеннных функций / инициализации слишком большого числа переменных стек может переполниться Причины возникновения: 1. Бесконечная рекурсия 2. Очень глубокая рекурсия 3. Очень большие переменные
это функция, которая вызывает сама себя. • Хвостовая рекурсия – рекурсия, в которой последней операцией перед выходом из функции является рекурсивный вызов. • Давайте напишем факториал!
wchar_t, char16_t и char32_t • В начале файла может быть BOM • А как понять, какая кодировка? Количество октетов Значащих бит Шаблон 1 7 0xxxxxxx 2 11 110xxxxx 10xxxxxx 3 16 1110xxxx 10xxxxxx 10xxxxxx 4 36 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
• Требует больше внимательности. • Следует использовать, есть очень жёсткие требования по памяти, а также если придётся работать с C библиотеками, которые требуют такой формат ввода. • String более удобна. • Выделение/высвобождение динамической памяти может вести к дефрагментации памяти. • В целом требует больше ресурсов. • Следует использовать во всех остальных случаях.
– это абстракция, используемая для чтения и записи файлов, сокетов и т.п. в единой манере. Потенциально бесконечная последовательность данных, к которым можно получать последовательный доступ.
Библиотека <iostream> Плюсы: 1. Типобезопасна. 2. Гораздо более удобна ☺. 3. Есть строковые потоки. 4. Можно писать вывод для своих структур и классов.
<iostream>: • istream, wistream — читают данные из потока. • ostream, wostream — записывают данные в поток. • iostream, wiostream — читают и записывают данные в поток. • <fstream>: • ifstream, wifstream — читают данные из файла. • ofstream, wofstream — записывают данные в файл. • fstream, wfstream — читают и записывают данные в файл. • <sstream> • istringstream, wistringstream — читают данные из строки. • ostringstream, wostringstream — записывают данные в строку. • stringstream, wstringstream — читают и записывают данные в строку.
все пробелы, символы табуляции и символ новой строки get Извлекает символ из входного потока. Не считывает символ новой строки getline Извлекает символ из входного потока. peek Подсматривает следующий символ в потоке putback Кладет последний считанный символ обратно
для хранения данных, которые программа читает или записывает. • Использование буфера позволяет операционной системе объединить несколько операций вывода данной программы. • Запись в устройство медленное, возможность операционной системы объединить несколько операций вывода в одну способствует повышению производительности.
вывода освобождаются при выходе из функции main (). • В некий случайный момент времени буфер может оказаться заполненным. В этом случае перед записью следующего значения происходит сброс буфера. • Сброс буфера можно осуществить явно, использовав такой манипулятор, как endl. • Используя манипулятор unitbuf, можно установить такое внутреннее состояние потока, чтобы буфер освобождался после каждой операции вывода. Для объекта cerr манипулятор unitbuf установлен по умолчанию, поэтому запись в него приводит к немедленному выводу.
завершается аварийно. • При попытке отладить аварийно завершающуюся программу необходимо гарантировать, что любой подозрительный вывод будет сброшен сразу.
несвязанный файловый поток, fst ream — это один из типов, определенных в заголовке fstream fstream fstrm(s) Создает объект класса fstream и открывает файл по имени s. fstream fstrm (s, режим) Подобен предыдущему конструктору, но открывает файл s в указанном режиме fstrm.open (s) fstrm.open (s, режим) Открывает файл s и связывает его с потоком fstrm. fstrm.close() Закрывает файл, с которым связан поток fstrm. fstrm.is_open () Возвращает значение типа bool, указывающее, был ли cвязанный с потоком fstrm файл успешно открыт и не был ли он закрыт
чтения ios_base::out открыть файл для записи ios_base::ate при открытии переместить указатель в конец файла ios_base::app открыть файл для записи в конец файла ios_base::trunc удалить содержимое файла, если он существует ios_base::binary открытие файла в двоичном режиме
потоков ввода и вывода. • Класс iоstrеam отрабатывает ввод-вывод на консоль. • Класс fstream отрабатывает ввод-вывод в именованным файл. • Класс stringstream отрабатывает ввод-вывод в строки в оперативной памяти. Классы fstream и stringstream связаны происхождением от класса iostream. Классы ввода происходят от класса istream, а классы вывода— от класса ostгearn. Таким образом, операции, которые могут быть выполнены с объектом класса istream, могут быть также выполнены с объектом класса ifstream или istringstream. Аналогично для классов вывода, происходящих от класса ostream.
с помощью рекурсии и без неё. • Попробовать уронить программу с помощью переполнения стека. • Ввести строку и заменить все встречающиеся в ней суммы натуральных чисел на их результаты. Например, при вводе 5+26-72+35gh32+45. Результат должен быть 31-107gh77. • Написать программу, которая из файла получает строку с математическим выражением и разбивает ее на обратную польскую запись и выводит в файл следующей строкой. • Ввести строку и после каждого вхождения в нее подстроки «password:» заменить восемь следующих символов на звездочки.