Многопоточное программирование (Лекция 1). Стандарты C++, контейнеры C++, красно-черные деревья, B-деревья

Содержание

Слайд 2

Литература Джеф Элджер. С++: Библиотека пограммиста Jeff Alger. C++ for Real Programmers

Литература

Джеф Элджер. С++: Библиотека пограммиста
Jeff Alger. C++ for Real Programmers

Слайд 3

Стандарты C++ C++98/C++03 Boost C++11 C++14

Стандарты C++

C++98/C++03
Boost
C++11
C++14

Слайд 4

Контейнеры C++ STL STL (C++11) Boost

Контейнеры C++

STL
STL (C++11)
Boost

Слайд 5

Контейнеры STL Последовательные контейнеры Ассоциативные контейнеры Контейнеры-адаптеры Псевдоконтейнеры

Контейнеры STL

Последовательные контейнеры
Ассоциативные контейнеры
Контейнеры-адаптеры
Псевдоконтейнеры

Слайд 6

Контейнеры STL Последовательные контейнеры Ассоциативные контейнеры Контейнеры-адаптеры Псевдоконтейнеры

Контейнеры STL

Последовательные контейнеры
Ассоциативные контейнеры
Контейнеры-адаптеры
Псевдоконтейнеры

Слайд 7

Последовательные контейнеры STL std::vector std::list std::deque

Последовательные контейнеры STL

std::vector
std::list
std::deque

Слайд 8

Ассоциативные контейнеры STL std::set std::map std::multiset std::multimap

Ассоциативные контейнеры STL

std::set
std::map
std::multiset
std::multimap

Слайд 9

Красно-черные деревья

Красно-черные деревья

Слайд 10

Красно-черные деревья

Красно-черные деревья

Слайд 11

Красно-черные деревья http://www.youtube.com/v/vDHFF4wjWYU

Красно-черные деревья

http://www.youtube.com/v/vDHFF4wjWYU

Слайд 12

B-деревья https://code.google.com/p/cpp-btree/

B-деревья

https://code.google.com/p/cpp-btree/

Слайд 13

B-деревья btree_set btree_map btree_multiset btree_multimap

B-деревья

btree_set
btree_map
btree_multiset
btree_multimap

Слайд 14

Контейнеры-адаптеры STL std::stack std::queue std::priority_queue

Контейнеры-адаптеры STL

std::stack
std::queue
std::priority_queue

Слайд 15

Псевдоконтейнеры STL std::bitset std::basic_string std::valarray

Псевдоконтейнеры STL

std::bitset
std::basic_string
std::valarray

Слайд 16

Последовательные контейнеры STL (C++11) std::array std::forward_list

Последовательные контейнеры STL (C++11)

std::array
std::forward_list

Слайд 17

std::array vs. std::vector std::vector хранит все элементы в куче std::array хранит

std::array vs. std::vector

std::vector хранит все элементы в куче
std::array хранит все элементы

в себе
std::array не может изменить свой размер
std::array должен знать свой размер на этапе компиляции
std::array работает быстрее
Слайд 18

std::forward_list Итератор может двигаться только в одном направлении. #include #include int

std::forward_list

Итератор может двигаться только в одном направлении.

#include
#include
int main ()
{

std::forward_list mylist = { 34, 77, 16, 2 };
std::cout << "mylist contains:";
for ( auto it = mylist.begin(); it != mylist.end(); ++it )
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
Слайд 19

Хэш-таблицы STL (C++11) std::unordered_set std::unordered_map std::unordered_multiset std::unordered_multimap

Хэш-таблицы STL (C++11)

std::unordered_set
std::unordered_map
std::unordered_multiset
std::unordered_multimap

Слайд 20

Хэш-таблицы STL (C++11)

Хэш-таблицы STL (C++11)

Слайд 21

Хэш-таблицы STL (C++11)

Хэш-таблицы STL (C++11)

Слайд 22

boost::circular_buffer

boost::circular_buffer

Слайд 23

boost::circular_buffer_space_optimized

boost::circular_buffer_space_optimized

Слайд 24

Умные указатели

Умные указатели

Слайд 25

Умные указатели Пример «самодельного» умного указателя. class PFoo { private: Foo*

Умные указатели

Пример «самодельного» умного указателя.

class PFoo {
private:
Foo* foo;


public:
PFoo() : foo(NULL) {}
PFoo(Foo* f) : foo(f) {}
operator Foo*() { return foo; }
Foo* operator->() { return foo; }
};
void f(Foo*);
PFoo pf(new Foo);
f(pf);
pf->MemberOfFoo();
Слайд 26

Умные указатели Пример «самодельного» умного указателя. template class SP { private:

Умные указатели

Пример «самодельного» умного указателя.

template
class SP {
private:


Type* pointer;
public:
SP() : pointer(NULL) {}
SP(Type* p) : pointer(p) {}
operator Type*() { return pointer; }
Type* operator->() { return pointer; }
};
void f(Foo*);
Ptr pf(new Foo);
f(pf);
pf->MemberOfFoo();
Слайд 27

std::auto_ptr (C++03)

std::auto_ptr (C++03)

Слайд 28

std::auto_ptr (C++03) Не использовать!

std::auto_ptr (C++03)

Не использовать!

Слайд 29

std::auto_ptr (C++03) #include int func() { std::auto_ptr PFoo1(new CFoo()); std::auto_ptr PFoo2;

std::auto_ptr (C++03)

#include
int func()
{
std::auto_ptr PFoo1(new CFoo());
std::auto_ptr PFoo2;
PFoo2 = PFoo1;
}

Пример некорректного использования

std::auto_ptr
Слайд 30

std::unique_ptr (C++11) Невозможность скопировать std::unique_ptr #include int func() { std::unique_ptr PFoo1(new

std::unique_ptr (C++11)

Невозможность скопировать std::unique_ptr

#include
int func()
{
std::unique_ptr PFoo1(new CFoo());
std::unique_ptr PFoo2;
PFoo2 = PFoo1;

// Ошибка при компиляции
}
Слайд 31

std::unique_ptr (C++11) Перемещение std::unique_ptr #include int func() { std::unique_ptr PFoo1(new CFoo());

std::unique_ptr (C++11)

Перемещение std::unique_ptr

#include
int func()
{
std::unique_ptr PFoo1(new CFoo());
std::unique_ptr PFoo2;
PFoo2 = std::move(PFoo1);
}

Слайд 32

std::shared_ptr (C++11) Пример использования std::shared_ptr #include int func() { std::shared_ptr PFoo1(new

std::shared_ptr (C++11)

Пример использования std::shared_ptr

#include
int func()
{
std::shared_ptr PFoo1(new CFoo());
std::shared_ptr PFoo2;
PFoo2 = PFoo1;
}

Слайд 33

std::shared_ptr (C++11)

std::shared_ptr (C++11)

Слайд 34

std::shared_ptr (C++11)

std::shared_ptr (C++11)

Слайд 35

std::weak_ptr (C++11)

std::weak_ptr (C++11)

Слайд 36

Аллокаторы

Аллокаторы

Слайд 37

Аллокаторы

Аллокаторы

Слайд 38

Аллокаторы

Аллокаторы

Слайд 39

Аллокаторы

Аллокаторы

Слайд 40

Аллокаторы

Аллокаторы

Слайд 41

Аллокаторы

Аллокаторы

Слайд 42

Аллокаторы

Аллокаторы

Слайд 43

Аллокаторы

Аллокаторы

Слайд 44

Аллокаторы

Аллокаторы

Слайд 45

Аллокаторы

Аллокаторы

Слайд 46

Аллокаторы

Аллокаторы

Слайд 47

Аллокаторы

Аллокаторы

Слайд 48

Аллокаторы malloc/calloc/realloc/free new/delete new[]/delete[]

Аллокаторы

malloc/calloc/realloc/free
new/delete
new[]/delete[]

Слайд 49

Аллокаторы ccmalloc dmalloc tcmalloc

Аллокаторы

ccmalloc
dmalloc
tcmalloc

Слайд 50

ccmalloc Делаем утечки. void Leak(char *inStr) { char *str = (char

ccmalloc

Делаем утечки.

void Leak(char *inStr)
{
char *str = (char *) malloc(strlen(inStr));
memcpy(str,

inStr, strlen(inStr));
}
char *AvoidLeak(char *inStr)
{
char *str = (char *) malloc(strlen(inStr));
memcpy(str, inStr, strlen(inStr));
return str;
}
Слайд 51

ccmalloc Функция main с утечками. int main() { char *str; Leak("This

ccmalloc

Функция main с утечками.

int main()
{
char *str;
Leak("This leaks 19 bytes");

str = AvoidLeak("This is not a 26 byte leak");
free(str);
str = AvoidLeak("12 byte leak");
exit(0);
}
Слайд 52

ccmalloc Результат ccmalloc (1). * 61.3% = 19 Bytes of garbage

ccmalloc

Результат ccmalloc (1).

* 61.3% = 19 Bytes of garbage allocated in

1 allocation
| |
| | 0x40047306 in
| |
| | 0x080493eb in

| | at test1.c:20
| |
| | 0x0804935c in
| | at test1.c:5
| |
| `-----> 0x08052fb7 in
| at src/wrapper.c:318
Слайд 53

ccmalloc Результат ccmalloc (2). | * 38.7% = 12 Bytes of

ccmalloc

Результат ccmalloc (2).

|
* 38.7% = 12 Bytes of garbage allocated

in 1 allocation
| |
| | 0x40047306 in
| |
| | 0x0804941e in

| | at test1.c:23
| |
| | 0x080493a4 in
| | at test1.c:11
| |
| `-----> 0x08052fb7 in
| at src/wrapper.c:318
|
`------------------------------------------------------
Слайд 54

dmalloc Результат dmalloc. not freed: '0x45008' (12 bytes) from 'ra=0x1f8f4' not

dmalloc

Результат dmalloc.

not freed: '0x45008' (12 bytes) from 'ra=0x1f8f4'
not freed: '0x45028' (12

bytes) from 'unknown'
not freed: '0x45048' (10 bytes) from 'argv.c:1077'
known memory not freed: 1 pointer, 10 bytes
unknown memory not freed: 2 pointers, 24 bytes
Слайд 55

tcmalloc Работает быстрее, чем malloc из glibc LD_PRELOAD="/usr/lib/libtcmalloc.so"

tcmalloc

Работает быстрее, чем malloc из glibc
LD_PRELOAD="/usr/lib/libtcmalloc.so"

Слайд 56

Уплотнение памяти

Уплотнение памяти

Слайд 57

Уплотнение памяти

Уплотнение памяти

Слайд 58

Уплотнение памяти

Уплотнение памяти

Слайд 59

Уплотнение памяти

Уплотнение памяти

Слайд 60

Алгоритм Бейкера

Алгоритм Бейкера

Слайд 61

Уплотнение на месте

Уплотнение на месте

Слайд 62

Разобраться самостоятельно git make

Разобраться самостоятельно

git
make