C++ Academy
16.1K subscribers
374 photos
112 videos
1 file
382 links
По всем вопросам- @haarrp
Download Telegram
🖥 Практика на C, 2023-2024

Семинар 1.1. Алгоритм Евклида.
Семинар 1.2. Системы счисления.
Семинар 1.3. Числа Фибоначчи.
Допсеминар: unix shell
Семинар 2.1. Простые числа.
Семинар 2.2. Побитовые вычисления.
Семинар 2.3. Время и случайность.
Углубление пройденного: логическая память и виртуальная память.
Семинар 3.1. Линейный поиск и простые сортировки.
Семинар 3.2. Стратегия "разделяй и властвуй".

📌 источник

#cpp #programming

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Супер годная и свежайшая лекция от МФТИ

Здесь рассказывается о RISC-V, о процессе сборки C++ кода, о том, что происходит в ходе компиляции под капотом, про оптимизацию программ, про ассемблер, линкер и ещё про много всего

*RISC-V — открытая и свободная система команд и процессорная архитектура на основе концепции RISC (reduced instruction set computer)

Доступ по закрытой ссылке, оцените)
🔗 Youtube

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Что нужно учитывать, используя std::vector?

Основные плюсы и минусы происходят от линейного расположения элементов в памяти и ограничений, которые это расположение накладывает.

std::vector имеет:

Доступ к произвольному элементу за O(1).

Проблема: При превышении capacity — долгая вставка нового элемента (даже в конец), требующая поэлементного копирования.

Решение: С этим можно побороться, если зарезервировать заранее всю нужную память под все элементы, но мы редко знаем каким будет максимальное количество элементов. И памяти на все процессы так не напасёшься, даже учитывая оптимизацию современных ОС: когда ОС физически выделяет память только когда процесс начинает её использовать.


Хороший cache coherence:
В общем случае это означает более быстрый обход контейнера vector по сравнению с контейнерами а-ля list (map, set, forward_list etc).

Проблема: В частности, нужно разбираться с cache sharing.
Если vector параллельно обходят два потока и каждый из них модифицирует его содержимое, то вероятно кэши этих потоков будет смотреть на смежную область памяти vector-а. Тогда каждая из записей будет инвалидировать содержимое кеша ядра другого потока, тем самым приводя к регулярному refetch-у. В некоторых корнер кейсах замена vector на list может внезапно привести к улучшению перфоманса.

Решение: Лечится такая проблема обычно увеличением размера элемента до размера кешлайна. Либо же выдачей каждому потоку по N элементов, где (N * sizeof(ElementT)) == cacheline size.

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
В какой строке есть ошибка компиляции?
Anonymous Quiz
31%
Во всех
16%
1
17%
2
16%
3
20%
Ни в какой
🖥 Не стоит проверять результат вызова malloc с помощью assert

Указатель, который вернула функция malloc, необходимо проверить перед использованием. Неправильным решением будет использовать для этого макрос assert.

Функция malloc возвращает нулевой указатель, если невозможно выделить буфер памяти указанного размера. Поэтому прежде, чем разыменовать указатель, его нужно проверить на равенство NULL, например так:
int *ptr = malloc(sizeof(int) * N);
if (!ptr)
{
// Обработка ошибки выделения памяти
}


🔗 Подробнее можно почитать тут

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
📁 Мощный гайдлайн по C++ от самого Страуструпа

Здесь разобраны все самые важные понятия C++

Базовые конструкции C++
— Типы данных
— Ветвления и циклы
— Векторы и строки
— Составные типы данных
— Ссылки, указатели, константность
— Функции
— Шаблоны

Стандартная библиотека C++
— Последовательные контейнеры
— Ассоциативные контейнеры
— Алгоритмы
— Адаптеры и представления

Идиомы C++
— Классы
— Шаблонные классы
— Жизненный цикл объекта
— Наследование и полиморфизм
— Обработка исключений
— Идиома RAII и умные указатели

...и ещё много всего!

🔗 Гайдлайн

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Крутые фичи C++, о которых ты мог не знать

☑️Псевдонимы типов
template <typename T>
using dyn_arr = std::vector<T>;
dyn_arr<int> nums; // эквивалентно std::vector<int>

using func_ptr = int (*)(int);

Семантически похоже на использование typedef, однако псевдонимы типов легче читаются и совместимы с шаблонами С++.

☑️Пользовательские литералы
using ull = unsigned long long;

constexpr ull operator"" _KB(ull no)
{
return no * 1024;
}

constexpr ull operator"" _MB(ull no)
{
return no * (1024_KB);
}

cout<<1_KB<<endl;
cout<<5_MB<<endl;

По большей части это будут какие-нибудь реальные единицы, такие как kb, mb, км, см, рубли, доллары, евро и т.д. Пользовательские литералы позволяют вам работать с ними как с другими примитивными типами.
Очень удобно для единиц и измерения.

☑️std::initializer_list
std::pair<int, int> p = {1, 2};
std::tuple<int, int> t = {1, 2};
std::vector<int> v = {1, 2, 3, 4, 5};
std::set<int> s = {1, 2, 3, 4, 5};
std::list<int> l = {1, 2, 3, 4, 5};
std::deque<int> d = {1, 2, 3, 4, 5};

std::array<int, 5> a = {1, 2, 3, 4, 5};

Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, это справедливо и для вложенных контейнеров.

☑️auto & decltype
auto a = 3.14; // double
auto b = 1; // int
auto& c = b; // int&
auto g = new auto(123); // int*
auto x; // error -- `x` requires initializer

auto-типизированные переменные выводятся компилятором на основе типа их инициализатора

☑️Циклы for по диапазону
std::array<int, 5> a {1, 2, 3, 4, 5};
for (int& x : a) x *= 2;
// a == { 2, 4, 6, 8, 10 }


☑️Делегирование конструкторов
struct demo
{
int m_var;
demo(int var) : m_var(var) {}
demo() : demo(0) {}
};

demo d;

Конструкторы теперь могут вызывать другие конструкторы из того же класса с помощью списка инициализаторов.

Вообще, фичей у плюсов много, используй их для повышения производительности
Вот статья в тему 21 фича современного C++, которые вам обязательно пригодятся «https://habr.com/ru/companies/otus/articles/741428/»

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Вероятно, лучшие лекции по плюсам в Рунете от Владимирова К. И.

В этом сборнике по C++ на 600 страниц разбирается абсолютно всё, в том числе:

Основы C++:
Введение в C++
Синтаксис и структура программы на C++
Переменные, типы данных и операторы
Управляющие конструкции (условные операторы, циклы)

Функции и ООП:
Функции и их использование
Основы объектно-ориентированного программирования (ООП)
Классы и объекты
Наследование и полиморфизм

Указатели, массивы и структуры данных:
Указатели и ссылки
Динамическое выделение памяти
Массивы и строки
Стандартные шаблонные библиотеки (STL)

Исключения, обработка ошибок и шаблоны:
Исключения и обработка ошибок
Шаблоны (templates) и их применение
Обобщенное программирование

Файлы и потоки:
Работа с файлами и потоками в C++
Сериализация и десериализация данных

Многопоточное программирование:
Основы многопоточного программирования
Синхронизация потоков
Параллельные вычисления

Продвинутые темы:
Метапрограммирование
Рефлексия
Работа с внешними библиотеками (API)

🔜 PDF

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 System2

Небольшая библиотека для кроссплатформенного запуска команд оболочки, которая может считывать стандартный вывод, выполнять асинхронный запуск и т.д...

https://github.com/Neko-Box-Coder/System2

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM