Forwarded from Книги для C/C++ разработчиков
📚Smaller C: Lean Code for Small Machines (2021)
✍️Автор: Marc Loy
📃Страниц: 314
Для людей, которые хотят использовать самые маленькие микроконтроллеры или добиться максимальной производительности от более крупных, язык Си по-прежнему является лучшим вариантом. Эта практическая книга дает прочное основание знаний по Cи для всех, кто имеет дело с программированием микроконтроллеров. Вы изучите множество способов, с помощью которых Cи позволяет разработчикам и производителям добиваться больших результатов с помощью крошечных устройств.
Ссылка на книгу
✍️Автор: Marc Loy
📃Страниц: 314
Для людей, которые хотят использовать самые маленькие микроконтроллеры или добиться максимальной производительности от более крупных, язык Си по-прежнему является лучшим вариантом. Эта практическая книга дает прочное основание знаний по Cи для всех, кто имеет дело с программированием микроконтроллеров. Вы изучите множество способов, с помощью которых Cи позволяет разработчикам и производителям добиваться больших результатов с помощью крошечных устройств.
Ссылка на книгу
🤸🤸♂️ Механизм перезапускаемых последовательностей (Rseq) при работе с TCMalloc
В TCMalloc кэши для отдельных ядер процессора реализуются при помощи перезапускаемых последовательностей man rseq(2) под Linux. При помощи перезапускаемых последовательностей можно вплоть до завершения выполнять область памяти (атомарно, относительно других потоков, выполняющихся на том же ядре процессора), либо выходить из этого процесса, если ядро прервёт этот процесс, например, вытеснив его или прервавшись на обработку сигнала.
Если вы хотите организовать перезапуск системы при миграции с ядра на ядро или при вытеснении процесса, то наиболее общий случай такой операции можно оптимизировать (не переносить с ядра на ядро тот процесс, который уже выполняется), избегая атомарных операций. Можно оптимизировать и более редкий случай — вытеснение как таковое. В результате такого компромисса нужно обеспечить, чтобы на всех путях выполнения нашего кода поддерживались такие операции перезапуска. Вся последовательность, кроме окончательного сохранения в памяти, когда изменение фиксируется, должна быть приспособлена к перезапуску.
Продолжить
#туториал
В TCMalloc кэши для отдельных ядер процессора реализуются при помощи перезапускаемых последовательностей man rseq(2) под Linux. При помощи перезапускаемых последовательностей можно вплоть до завершения выполнять область памяти (атомарно, относительно других потоков, выполняющихся на том же ядре процессора), либо выходить из этого процесса, если ядро прервёт этот процесс, например, вытеснив его или прервавшись на обработку сигнала.
Если вы хотите организовать перезапуск системы при миграции с ядра на ядро или при вытеснении процесса, то наиболее общий случай такой операции можно оптимизировать (не переносить с ядра на ядро тот процесс, который уже выполняется), избегая атомарных операций. Можно оптимизировать и более редкий случай — вытеснение как таковое. В результате такого компромисса нужно обеспечить, чтобы на всех путях выполнения нашего кода поддерживались такие операции перезапуска. Вся последовательность, кроме окончательного сохранения в памяти, когда изменение фиксируется, должна быть приспособлена к перезапуску.
Продолжить
#туториал
Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
👨💻🧩 Психология и ИТ: 17 личностных качеств, необходимых для успешной карьеры
В статье разберем, какие качества необходимы для успешного старта в IT-сфере.
Читать статью
#новость
В статье разберем, какие качества необходимы для успешного старта в IT-сфере.
Читать статью
#новость
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Библиотека cstdint
🧐 Что такое cstdint?
• cstdint — это библиотека в C++, предоставляющая набор типов данных для точного задания размера и формата целочисленных значений
🚀 Преимущества использования cstdint
• Портабельность: Гарантирует одинаковый размер типов на разных платформах
• Ясность кода: Позволяет явно указывать размер используемого типа
🧐 Что такое cstdint?
• cstdint — это библиотека в C++, предоставляющая набор типов данных для точного задания размера и формата целочисленных значений
🚀 Преимущества использования cstdint
• Портабельность: Гарантирует одинаковый размер типов на разных платформах
• Ясность кода: Позволяет явно указывать размер используемого типа
📚 std::exception — это базовый класс для всех стандартных исключений в C++
Почему стоит наследоваться от std::exception?
• Единообразие в обработке исключений: Когда вы наследуетесь от std::exception, ваш класс исключения приобретает интерфейс, который делает его совместимым с другими стандартными исключениями
• what() метод: std::exception предоставляет важный метод what(), который возвращает строковое представление исключения. Это позволяет вам предоставлять информативные сообщения об ошибке при обработке исключений
• Легкость в поддержке кода: Если вы используете сторонние библиотеки или фреймворки, они также могут ожидать обработку исключений, производных от std::exception
• Стандартные типы исключений: std::exception имеет несколько стандартных подклассов, таких как std::runtime_error, std::logic_error и другие. Вы можете использовать эти подклассы вместо базового std::exception, чтобы более точно определить характер ошибки
Почему стоит наследоваться от std::exception?
• Единообразие в обработке исключений: Когда вы наследуетесь от std::exception, ваш класс исключения приобретает интерфейс, который делает его совместимым с другими стандартными исключениями
• what() метод: std::exception предоставляет важный метод what(), который возвращает строковое представление исключения. Это позволяет вам предоставлять информативные сообщения об ошибке при обработке исключений
• Легкость в поддержке кода: Если вы используете сторонние библиотеки или фреймворки, они также могут ожидать обработку исключений, производных от std::exception
• Стандартные типы исключений: std::exception имеет несколько стандартных подклассов, таких как std::runtime_error, std::logic_error и другие. Вы можете использовать эти подклассы вместо базового std::exception, чтобы более точно определить характер ошибки
Forwarded from Библиотека задач по C++ | тесты, код, задания
В докладе автор в лёгкой форме рассказывает о C++, его применение, особенностях и всё это переправлено мемами😆
Антон Соснин — С++ в мемах
#junior
Антон Соснин — С++ в мемах
#junior
⚡ ️Разреженные структуры данных
В статье рассмотрены разреженные структуры данных
Разряженные структуры данных (sparse data structures) представляют собой специальные типы данных, предназначенные для эффективного хранения и обработки данных, в которых большинство элементов имеют некоторое стандартное или дефолтное значение, и только небольшое количество элементов отличается от этого значения
Рассматриваемые алгоритмы:
Sparse Array (Sparse Matrix)
Sparse List
Sparse Deque (sparque)
Sparse Set
Sparse Map
Разреженные структуры данных
В статье рассмотрены разреженные структуры данных
Разряженные структуры данных (sparse data structures) представляют собой специальные типы данных, предназначенные для эффективного хранения и обработки данных, в которых большинство элементов имеют некоторое стандартное или дефолтное значение, и только небольшое количество элементов отличается от этого значения
Рассматриваемые алгоритмы:
Sparse Array (Sparse Matrix)
Sparse List
Sparse Deque (sparque)
Sparse Set
Sparse Map
Разреженные структуры данных
Приведение типов в C++
1. static_cast
В общем тот же reinterpret_cast, только делает проверку во время компиляции на совместимость. Проверяет можем ли мы сделать downcasting типа, привести тип родителя к типу потомка. Когда заранее известно, что может быть только один тип потомка
2. dynamic_cast
Динамическое преобразование типов, когда информация о типе появляется только во время исполнения программы
3. reinterpret_cast
Сообщает, что в данном участке памяти лежат те или иные типы данных и он этого никак не проверяет. В данном случае программист сам решает
4. const_cast
Снимает const квалификатор. Если понадобился const_cast, то действительно пошло что-то не так и пытаемся снять константность
5. C-style cast
Замаскированное применение const_cast, static_cast, reinterpret_cast и их комбинаций. Применяются в следующем порядке
• const_cast
• static_cast
• static_cast + const_cast
• reinterpret_cast
• reinterpret_cast + const_cast
1. static_cast
В общем тот же reinterpret_cast, только делает проверку во время компиляции на совместимость. Проверяет можем ли мы сделать downcasting типа, привести тип родителя к типу потомка. Когда заранее известно, что может быть только один тип потомка
2. dynamic_cast
Динамическое преобразование типов, когда информация о типе появляется только во время исполнения программы
3. reinterpret_cast
Сообщает, что в данном участке памяти лежат те или иные типы данных и он этого никак не проверяет. В данном случае программист сам решает
4. const_cast
Снимает const квалификатор. Если понадобился const_cast, то действительно пошло что-то не так и пытаемся снять константность
5. C-style cast
Замаскированное применение const_cast, static_cast, reinterpret_cast и их комбинаций. Применяются в следующем порядке
• const_cast
• static_cast
• static_cast + const_cast
• reinterpret_cast
• reinterpret_cast + const_cast
Forwarded from Библиотека собеса по C++ | вопросы с собеседований
🔍 Что такое std::thread?
std::thread предоставляет собой интерфейс для взаимодействия с системными потоками
💡Что можно запустить?
• Любой функтор можно превратить в поток
💡Что можно передать при запуске потока?
• Можно передать любое количество параметров, но стоит учитывать, что все они будут копироваться
• Чтобы передать ссылку, её стоит обернуть в std::ref или std::cref
💡Что можно сделать с потоком?
• После создания потока мы можем с ним делать две вещи: вызвать join и ждать завершение потока или вызвать detach, тогда поток просто будет работать (пока сам не завершится)
💡Начиная с C++20 появился std::jthread
• Это тоже самое, но в деструкторе будет вызываться join
std::thread предоставляет собой интерфейс для взаимодействия с системными потоками
💡Что можно запустить?
• Любой функтор можно превратить в поток
💡Что можно передать при запуске потока?
• Можно передать любое количество параметров, но стоит учитывать, что все они будут копироваться
• Чтобы передать ссылку, её стоит обернуть в std::ref или std::cref
💡Что можно сделать с потоком?
• После создания потока мы можем с ним делать две вещи: вызвать join и ждать завершение потока или вызвать detach, тогда поток просто будет работать (пока сам не завершится)
💡Начиная с C++20 появился std::jthread
• Это тоже самое, но в деструкторе будет вызываться join
🤔 Что такое structural bindings?
• Данная фитча появилась в C++17
• Это механизм, который позволяет нам декомпозировать структуры данных, такие как tuple, pair, и даже свои пользовательские структуры, на более простые именованные переменные
• Это делает код более читаемым, компактным и легко поддерживаемым
🌐 Ссылки
• Восемь возможностей C++17, которые должен применять каждый разработчик
• Structured binding declaration
• Structured binding in C++ https://habr.com/ru/articles/343622/
• Данная фитча появилась в C++17
• Это механизм, который позволяет нам декомпозировать структуры данных, такие как tuple, pair, и даже свои пользовательские структуры, на более простые именованные переменные
• Это делает код более читаемым, компактным и легко поддерживаемым
🌐 Ссылки
• Восемь возможностей C++17, которые должен применять каждый разработчик
• Structured binding declaration
• Structured binding in C++ https://habr.com/ru/articles/343622/
Примеры трюков на C++
Список современных приемов C++, часто используемых на собеседованиях по программированию и соревновательном программировании
modern-cpp-tricks
Список современных приемов C++, часто используемых на собеседованиях по программированию и соревновательном программировании
modern-cpp-tricks
Forwarded from Библиотека собеса по C++ | вопросы с собеседований
🌟 Что такое std::optional?
Это класс, появился начиная с C++17, который даёт удобный способ работы с «возможно отсутствующим» значением
🌐 Ссылки
• std::optional
• std::optional in C++
• Рефакторинг с использованием C++17 std::optional
• Использование std::optional в С++17
Это класс, появился начиная с C++17, который даёт удобный способ работы с «возможно отсутствующим» значением
🌐 Ссылки
• std::optional
• std::optional in C++
• Рефакторинг с использованием C++17 std::optional
• Использование std::optional в С++17
🌟 std::expected (С++23)
std::expected — это механизм, который появился в библиотеке C++23 и предназначен для работы с функциями, которые могут завершиться не только успешно, но и с ошибкой. Он предоставляет альтернативный подход к обработке ошибок, который отличается от использования исключений или статусных кодов
📘 Ссылки
• На грани между exceptions и std::expected
• Using std::expected from C++23
• std::expected
std::expected — это механизм, который появился в библиотеке C++23 и предназначен для работы с функциями, которые могут завершиться не только успешно, но и с ошибкой. Он предоставляет альтернативный подход к обработке ошибок, который отличается от использования исключений или статусных кодов
📘 Ссылки
• На грани между exceptions и std::expected
• Using std::expected from C++23
• std::expected
Статьи за неделю
• Создаем свою STL-совместимую реализацию std::allocator с лучшей производительностью
• Zoom в Qt виджете
• Какой тип ordering должен возвращать мой operator<=> в C++?
• Разреженные структуры данных
• Qt Creator* ищет ошибки в Qt Creator
• Настройка C++ проекта c OpenMP. Обертывание С++ для Python с помощью pybind11 и CMake
• Многообразие функциональных обёрток
• Создаем свою STL-совместимую реализацию std::allocator с лучшей производительностью
• Zoom в Qt виджете
• Какой тип ordering должен возвращать мой operator<=> в C++?
• Разреженные структуры данных
• Qt Creator* ищет ошибки в Qt Creator
• Настройка C++ проекта c OpenMP. Обертывание С++ для Python с помощью pybind11 и CMake
• Многообразие функциональных обёрток
Ответьте на 3 вопроса, чтобы получить вводные занятия к курсу «Алгоритмы и структуры данных»
🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/cfe3ce33
На вводной части вас ждут:
▪️ Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов
▪️ Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ
▪️ Практические задания после лекций
▪️ Ссылки на дополнительные материалы для самостоятельного изучения
⚡️ Переходите и начинайте учиться уже сегодня – https://proglib.io/w/cfe3ce33
🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/cfe3ce33
На вводной части вас ждут:
▪️ Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов
▪️ Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ
▪️ Практические задания после лекций
▪️ Ссылки на дополнительные материалы для самостоятельного изучения
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблема «Most vexing parse»
Most vexing parse — это ситуация в языке программирования C++, когда компилятор интерпретирует объявление функции вместо объявления объекта, когда это может быть неочевидным для программиста
Проблема возникает из-за того, что определение функции может быть легко спутано с объявлением объекта, который использует конструктор с пустыми скобками
Чтобы избежать проблемы most vexing parse, можно использовать универсальную инициализацию (uniform initialization) с помощью фигурных скобок {}
Most vexing parse — это ситуация в языке программирования C++, когда компилятор интерпретирует объявление функции вместо объявления объекта, когда это может быть неочевидным для программиста
Проблема возникает из-за того, что определение функции может быть легко спутано с объявлением объекта, который использует конструктор с пустыми скобками
Чтобы избежать проблемы most vexing parse, можно использовать универсальную инициализацию (uniform initialization) с помощью фигурных скобок {}