×Закрыть

C++ дайджест № 3: Управління пам’яттю та алгоритми

Про управління пам’яттю, алгоритми та структури даних, а також трошки історії алгоритмів та ОС Unix, CppCon 2015 та інше.

Алгоритми та структури даних

Як написати константний вираз для обчислення натурального логарифма на C++.

Gorilla — архітектура швидкої, масштабованої бази даних для роботи з часовими рядами в пам’яті — наукова стаття від працівників Facebook Inc.

Відео

Jonathan Blow — роздуми про те, яким повинна бути нова мова програмування для ігор. Відео достатньо старе, але варте уваги. Автор дискутує про фундаментальні проблеми C++, а також аналізує, які альтернативи пропонують «нові» мови програмування.

CppCon 2015: Scott Wardle: «Пам’ять та відлагоджування коду на C++ в Electronic Arts».

Frameworks, Tools & Services

Amazon випустив AWS SDK для C++ після багатьох років розробки. Як заявляють програмісти — для розробників ігор. SDK інтегрується з STL, підтримує стандарт C++11 та багато іншого.

ConcurrencyKit — бібліотека, що реалізує примітиви, неблокуючі структури даних та безпечний доступ до пам’яті на С.

Jim Springfield про те, як Microsoft збирається «омолодити» свій C/C++ компілятор.

Модульне тестування Embedded C додатків за допомогою Ceedling.

Нарешті і в C++ світі почали з’являтись достойні менеджери пакетів. Прикладом є свіжий qpm.io — Qt Package Manager. А тут — анонс.

Object-Oriented Design

Реалізація шаблону проектування Dependency Injection на C++ з використанням Variadic Templates.

Техніки об’єктно-орієнтованої розробки на С, а також генератор boilerplate-коду.

Stupid Template Tricks: Template Assembler.

Управління пам’яттю

ManagedC — цікава наукова стаття про те, як організувати memory-safe виконання C коду на JVM.

Joint Allocations in C++ - стаття про те, як уникати сегментації пам’яті при роботі з комплексними об’єктами.

Нові елементи С++ - конструктори переміщення та оператор присвоєння з переміщенням.

Eli Bendersky про організацію видалення деструкторів та віртуальну таблицю операторів в картинках.

Linux Insights — як Linux запускає і виконує програму. Четверта стаття циклу. Там же є посилання на інші статті (будуть корисні системним розробникам та просто розробникам додатків під Linux).

buldozer00: Stack, Heap, and Pool — реалізація пула пам’яті на C++11.

Alexander Krizhanovskiy: Швидкі алокатори пам’яті: Boost, nGinX, та Tempesta FW.

Nicole Hemsoth про те, що немає такої речі, як продуктивність роботи пам’яті.

Pet Monster Projects

Pierre Langlois з презентацією про те, як інтегрувати KDBus в Android.

Folly Futures — реалізація Futures для concurrency від Facebook.

Вступ до розробки ядра Linux, або стаття про те, як долучитись до проекту.

На Cassandra Summit показали ScyllaDB — Cassandra, переписана на С++, що працює в 10 разів швидше.

Трошки історії

Кращі алгоритми 20-го століття: топ-10 за версією редакції SIAM.

Для цінувальників антикваріату: «відреставровані» коди першої версії ОС Unix.

Інше

C++ Frequently asked Questions & Answers опубліковані на Github.

C++ Core Guidelines — рекомендації по розробці на C++ під редакцією Bjarne Stroustrup та Herb Sutter.

Andrew Chambers: Calling Conventions are hard та невеличка утиліта ABIFUZZ.

Часткове виконання байт-коду з використанням C++ шаблонів.

Herb Sutter: CppCon 2015, day 2: «Writing Good C++14... By Default».

Benny Kerr для MSDN magazine про корутіни в Visual C++ 2015.

Шютки

— Why do you call this version of software ’beta’?

— Coz it’s beta than nothing.

Bud представив холодильник, в якому не закінчується пиво :)


← Попередній випуск: C++ дайджест #2
Наступний випуск: C++ дайджест #4

LinkedIn

13 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Проглядел заметку:

buldozer00: Stack, Heap, and Pool — реалізація пула пам’яті на C++11.

Я вот не пойму — В статье хорошая реализация пула?
Если просить у new из разных потоков память, то никогда не будет накладки, а в этой реализации будет гонка. Плюс изначально у new будет оверхед по скорости из-за использования чего-то типа мьютекса, так что сравнивать не очень правильно.

Результаты замеров с того сайта у меня похожие.
Но если внести некоторые изменения(т.е. уменьшить (в ~60 раз) размер хранимых элементов и увеличить (в 40 раз) их количество):
diff main.cpp newmain.cpp
11c11
< static const int32_t NUM_BYTES{1000 *1024};
---
> static const int32_t NUM_BYTES{16*1024};
28c28
< constexpr int32_t NUM_ALLOCS{1000};
---
> constexpr int32_t NUM_ALLOCS{40*1000};
То пул на массиве покуривает в сторонке:
_____________________________________________________________________________________
Heap Allocations took 1889 milliseconds  | Heap Allocations took 520 milliseconds
Stack Allocations took 38 milliseconds  | Stack Allocations took 17 milliseconds
Pool construction took 1289 milliseconds  | Pool construction took 345 milliseconds
Pool Allocations took 5454 milliseconds  | Pool Allocations took 846 milliseconds
_____________________________________________________________________________________
g++ -std=c++11 newmain.cpp -g -O0 -o mO0_arr_pool | g++ -std=c++11 newmain.cpp -O3 -o mO3_arr_pool
gcc version 4.8.4 (GCC).
Пул на мультисете — works like a charm, но, раз уж использовались фичи 11 стандарта, то можно было б использовать std::unordered_multiset. Было б еще лучше, я думаю.

Прошу прощения заранее, если навесил ярлыков по неопытности=).

> а в этой реализации будет гонка.

Гонки не будет, будут баги и вылеты. Я вообще не вижу там даже попыток синхронизации доступа.
Вообще, конечно, очень плохая реализация. Small objects allocator Александреску был бы гораздо полезнее для изучения.

Есть еще такая интересная онлайн книга, автор ее переодически обновляет. Рекомендуется к прочтению: www.agner.org/...timize/optimizing_cpp.pdf

Оставлю заметку тут, не свежак, но управления памятью каcается:
Вкратце — некто Херб Саттер, рекомендует использовать make_shared вместо shared_ptr + new.
Ну а автор заметки показывает случай, когда это не эфеективно:
lanzkron.wordpress.com/...d-almost-a-silver-bullet

Вообще, рекомендую всем интересующимся фичами C++11/14 (и подводными камнями их использования) прочитать книгу «Effective Modern C++» Скотта Майерса. Тоже «не свежак» уже, но книга относительно новая, многие ещё не читали.
Приведенный Вами пример также полностью охватывается данной книгой — см. «Item 21: Prefer std::make_unique and std::make_shared to direct use of new.» Там даётся общая рекомендация использовать make_shared вместо new и приводятся случаи-исключения, в том числе и описанный в приведенной Вами статье.

О, спасибо, скачал книжку. У меня, распечатанный Мейерс есть, но древнее. Тот что просто Effective C++, 55 spec ways.... Кулл.

Почитав статтю Eli Bendersky, але як видаляти конструктори, так і не зрозумів :(

Это, наверное, потому что в статье про это ни слова.

Там помилка, має бути «видалення деструкторів» (

А як можна видаляти деструктори, хтось мені може пояснити?
Я, звісно, не експерт в C++ або англійській мові, але чомусь мені здається, що мова йде про «деструктори видалення» (чи «видаляючі деструктори», whatever). Хіба ні?

Справедливо :)
Але в тій статті мова йде зовсім не про видалення деструкторів за допомогою фічі C++11 «= delete;».

Подписаться на комментарии