Upgrade to Pro — share decks privately, control downloads, hide ads and more …

АФТИ ООП 2013-2014. Лекция I/02

Oleg Dashevskii
September 16, 2013

АФТИ ООП 2013-2014. Лекция I/02

Oleg Dashevskii

September 16, 2013
Tweet

More Decks by Oleg Dashevskii

Other Decks in Education

Transcript

  1. ПРЕДЫДУЩАЯ СЕРИЯ • ООП — это парадигма. • Парадигма —

    это умное слово способ смотреть на мир и что-то видеть (Фигура на Фоне).
  2. ПРЕДЫДУЩАЯ СЕРИЯ • ООП — это парадигма. • Парадигма —

    это умное слово способ смотреть на мир и что-то видеть (Фигура на Фоне). • Применяя ООП, мы «видим» объекты, отношения между ними и их взаимодействие.
  3. ПРЕДЫДУЩАЯ СЕРИЯ • ООП — это парадигма. • Парадигма —

    это умное слово способ смотреть на мир и что-то видеть (Фигура на Фоне). • Применяя ООП, мы «видим» объекты, отношения между ними и их взаимодействие. • В зависимости от решаемой задачи можно увидеть разные объекты.
  4. Объект окружающего мира 0/1 Данные Алгоритмы Память Код Баги Интерфейс

    Реализация Объект программного мира 1. Свойства 2. Поведение (реакция на сообщения)
  5. Объект окружающего мира 0/1 Данные Алгоритмы Память Код Баги Интерфейс

    Реализация Объект программного мира ? 1. Свойства 2. Поведение (реакция на сообщения)
  6. СХОДСТВА И РАЗЛИЧИЯ • Порода • Рост • Вес •

    Цвет • ... Свойства: • Лаять • Выть • Кусать • Приносить палочку • ... Поведение:
  7. vs.

  8. ПРЕДСТАВЛЕНИЕ ОБЪЕКТА • Свойства — данные, находятся где-то в памяти.

    • Поведение — код, имеющий доступ к данным. • Вопрос: как это все реализовать, например, на языке C?
  9. ГДЕ ХРАНИТЬ ДАННЫЕ? • typedef struct { ... } Dog;

    • Виды памяти в C: • глобальная;
  10. ГДЕ ХРАНИТЬ ДАННЫЕ? • typedef struct { ... } Dog;

    • Виды памяти в C: • глобальная; • автоматическая (стековая);
  11. ГДЕ ХРАНИТЬ ДАННЫЕ? • typedef struct { ... } Dog;

    • Виды памяти в C: • глобальная; • автоматическая (стековая); • динамическая (malloc / free).
  12. ФУНКЦИИ, СВЯЗАННЫЕ С ОБЪЕКТОМ • «Методы» объекта. • void dog_bark(Dog

    *dog, int loudness); • Создание / инициализация: • void dog_initialize(Dog *dog); • Dog *dog_create();
  13. ФУНКЦИИ, СВЯЗАННЫЕ С ОБЪЕКТОМ • «Методы» объекта. • void dog_bark(Dog

    *dog, int loudness); • Создание / инициализация: • void dog_initialize(Dog *dog); • Dog *dog_create(); • Уничтожение: • void dog_destroy(Dog *dog);
  14. ФУНКЦИИ, СВЯЗАННЫЕ С ОБЪЕКТОМ • «Методы» объекта. • void dog_bark(Dog

    *dog, int loudness); • Создание / инициализация: • void dog_initialize(Dog *dog); • Dog *dog_create(); • Уничтожение: • void dog_destroy(Dog *dog); Конструктор Деструктор
  15. RATIONAL.H #ifndef __rational_h #define __rational_h #include <stdio.h> struct Rational {

    int numer; /* numerator, числитель */ int denom; /* denominator, знаменатель */ }; void rat_add(struct Rational *result, struct Rational *a, struct Rational *b); void rat_sub(struct Rational *result, struct Rational *a, struct Rational *b); void rat_mul(struct Rational *result, struct Rational *a, struct Rational *b); void rat_div(struct Rational *result, struct Rational *a, struct Rational *b); /* возведение в целочисленную степень. power может быть отрицательным! */ void rat_power(struct Rational *result, struct Rational *r, int power); void rat_create(struct Rational *res, int a, int b); /* возвращает -1 (a < b), 0 (a == b), 1 (a > b) */ int rat_compare(struct Rational *a, struct Rational *b); int rat_to_i(struct Rational *a); /* округление до ближ. целого */ double rat_to_d(struct Rational *a); /* преобразование в число с плав. точкой */ void rat_print(struct Rational *a, FILE *fp); /*выводит в формате p/q */ #endif Ничего не напоминает?
  16. ПАМЯТЬ В C-ПРОГРАММЕ Скомпилированный код Глобальная память (вкл. static) Только

    чтение Размер фиксирован Чтение / запись Размер фиксирован Время жизни переменных: максимально Занятый стек Свободный стек Чтение / запись Размер динамический, обычно ограничен сверху (задается в свойствах линкера) Время жизни переменных = время жизни фрейма
  17. СТЕКОВЫЕ ФРЕЙМЫ void MyFunction3(int x, int y, int z) {

    int a, int b, int c; a = 10; ... return; } _MyFunction3: push ebp mov ebp, esp sub esp, 12 ; sizeof(a) + sizeof(b) + sizeof(c) ; x = [ebp + 8], y = [ebp + 12], z = [ebp + 16] ; a = [ebp - 4] = [esp + 8], b = [ebp - 8] = [esp + 4], ; c = [ebp - 12] = [esp] mov [ebp - 4], 10 ... mov esp, ebp pop ebp ret 12 ; sizeof(x) + sizeof(y) + sizeof(z) ebp+16 Аргумент z ebp+12 Аргумент y ebp+8 Аргумент x ebp+4 Адрес возврата ebp Старый ebp ebp−4 Переменная a ebp−8 Переменная b ebp−12 Переменная c esp + 4 Свободная ячейка .... Свободная ячейка MyFunction3(10, 5, 2); push 2 push 5 push 10 call _MyFunction3 esp =
  18. КУЧА (HEAP) • heap_create: создание кучи с заданным размером. •

    heap_alloc: выделение памяти внутри кучи. • heap_free: освобождение памяти внутри кучи. • heap_realloc: изменение размера участка памяти внутри кучи. • heap_resize: изменение размера самой кучи. • heap_destroy: уничтожение кучи.
  19. TotalSize Сначала 1 свободный блок FreeSize Size1 Выделили 1-й блок

    FreeSize Size1 Size2 Выделили 2-й блок FreeSize Size2 Size1 Освободили 2-й блок (фрагментация)
  20. TotalSize Сначала 1 свободный блок FreeSize Size1 Выделили 1-й блок

    FreeSize Size1 Size2 Выделили 2-й блок FreeSize Size2 Size1 Освободили 2-й блок (фрагментация) TotalSize Освободили 1-й блок (блоки сгруппировались)
  21. Занятый блок (первый) Размер / состояние («занят») .... данные пользователя

    .... Размер / состояние («занят») Свободный блок Размер / состояние («свободен») .... неиспользуемая память .... Размер / состояние («свободен») Занятый блок Размер / состояние («занят») .... данные пользователя .... Размер / состояние («занят») Занятый блок (последний) Размер / состояние («занят») .... данные пользователя .... Размер / состояние («занят») ... другие блоки ...
  22. Занятый блок (первый) Размер / состояние («занят») .... данные пользователя

    .... Размер / состояние («занят») Свободный блок Размер / состояние («свободен») .... неиспользуемая память .... Размер / состояние («свободен») Занятый блок Размер / состояние («занят») .... данные пользователя .... Размер / состояние («занят») Занятый блок (последний) Размер / состояние («занят») .... данные пользователя .... Размер / состояние («занят») ... другие блоки ... Начало памяти кучи
  23. Занятый блок (первый) Размер / состояние («занят») .... данные пользователя

    .... Размер / состояние («занят») Свободный блок Размер / состояние («свободен») .... неиспользуемая память .... Размер / состояние («свободен») Занятый блок Размер / состояние («занят») .... данные пользователя .... Размер / состояние («занят») Занятый блок (последний) Размер / состояние («занят») .... данные пользователя .... Размер / состояние («занят») ... другие блоки ... Начало памяти кучи Конец памяти кучи