Как вы предпочитаете работать: дистанционно или в офисе?
#интерактив
#интерактив
Cache miss
Cache miss (промах в кэше) в C++ относится к ситуации, когда процессор не может найти нужные данные в кэше, и должен обратиться к более медленной памяти (например ОЗУ), для получения этих данных.
Когда код выполняется на процессоре, процессор пытается загрузить данные или инструкции из кэша первого, второго или третьего уровня (L1, L2, L3 и так далее), прежде чем обращаться к оперативной памяти. Если данные или инструкции отсутствуют в кэше, возникает кэш-промах (cache miss), и процессор должен загрузить их из оперативной памяти, что занимает гораздо больше времени, чем доступ к данным в кэше.
#код
Cache miss (промах в кэше) в C++ относится к ситуации, когда процессор не может найти нужные данные в кэше, и должен обратиться к более медленной памяти (например ОЗУ), для получения этих данных.
Когда код выполняется на процессоре, процессор пытается загрузить данные или инструкции из кэша первого, второго или третьего уровня (L1, L2, L3 и так далее), прежде чем обращаться к оперативной памяти. Если данные или инструкции отсутствуют в кэше, возникает кэш-промах (cache miss), и процессор должен загрузить их из оперативной памяти, что занимает гораздо больше времени, чем доступ к данным в кэше.
#код
Очередной #дайджест по С++:
✍️ Можно ли доверить компилятору оптимизацию вашего кода?
Автор объясняет общую структуру компиляторов, пригодную для оптимизации статических языков, таких как Rust или C++.
✍️ Проверка компилятора GCC 13 с помощью PVS-Studio
Цель — обнаружить ошибки в коде GCC с помощью анализатора PVS-Studio.
✍️ Почему C++ не устаревает
Что же делает язык с 40-летней историей таким популярным и почему сегодня он только укрепляет позиции?
✍️ Как я присоединился к сообществу bug 323
Это история о баге, от которого хочется рвать на себе волосы.
✍️ Приятный разговор о знаковых и беззнаковых целых числах (с обжаркой Google)
Правильный выбор целочисленного типа — плохо изученная тема, которая привела к стандартизации проблемных интерфейсов в C++, плохо разработанным требованиям безопасности и путанице среди разработчиков.
✍️ Можно ли доверить компилятору оптимизацию вашего кода?
Автор объясняет общую структуру компиляторов, пригодную для оптимизации статических языков, таких как Rust или C++.
✍️ Проверка компилятора GCC 13 с помощью PVS-Studio
Цель — обнаружить ошибки в коде GCC с помощью анализатора PVS-Studio.
✍️ Почему C++ не устаревает
Что же делает язык с 40-летней историей таким популярным и почему сегодня он только укрепляет позиции?
✍️ Как я присоединился к сообществу bug 323
Это история о баге, от которого хочется рвать на себе волосы.
✍️ Приятный разговор о знаковых и беззнаковых целых числах (с обжаркой Google)
Правильный выбор целочисленного типа — плохо изученная тема, которая привела к стандартизации проблемных интерфейсов в C++, плохо разработанным требованиям безопасности и путанице среди разработчиков.
std::atomic_thread_fence
std::atomic_thread_fence — это функция, которая устанавливает порядок синхронизации памяти для не атомарных и расслабленных атомарных доступов, как указано в аргументе order, без связанной атомарной операции.
std::atomic_thread_fence может использоваться для обеспечения правильного порядка чтения и записи в многопоточных программах.
В этом примере два потока выполняют функции write_x_then_y и read_y_then_x:
- write_x_then_y устанавливает значение атомарной переменной x равным 1, затем вызывает std::atomic_thread_fence с аргументом std::memory_order_release и устанавливает значение атомарной переменной y равным 1.
- read_y_then_x считывает значение атомарной переменной y, затем вызывает std::atomic_thread_fence с аргументом std::memory_order_acquire и считывает значение атомарной переменной x.
#код
std::atomic_thread_fence — это функция, которая устанавливает порядок синхронизации памяти для не атомарных и расслабленных атомарных доступов, как указано в аргументе order, без связанной атомарной операции.
std::atomic_thread_fence может использоваться для обеспечения правильного порядка чтения и записи в многопоточных программах.
В этом примере два потока выполняют функции write_x_then_y и read_y_then_x:
- write_x_then_y устанавливает значение атомарной переменной x равным 1, затем вызывает std::atomic_thread_fence с аргументом std::memory_order_release и устанавливает значение атомарной переменной y равным 1.
- read_y_then_x считывает значение атомарной переменной y, затем вызывает std::atomic_thread_fence с аргументом std::memory_order_acquire и считывает значение атомарной переменной x.
#код
Новая статическая идиома constexpr std::integral_constant
Небольшая заметка об улучшении, которое вы можете применять в своем коде.
Читать статью
Небольшая заметка об улучшении, которое вы можете применять в своем коде.
Читать статью
std::midpoint
std::midpoint — это функция, которая вычисляет среднюю точку между двумя целыми числами, числами с плавающей точкой или указателями. Она возвращает половину суммы a и b, при этом не происходит переполнения.
Если a и b имеют целочисленный тип и сумма является нечетной, то результат округляется в сторону a. Если a и b имеют тип с плавающей точкой, то происходит не более одной неточной операции.
#код
std::midpoint — это функция, которая вычисляет среднюю точку между двумя целыми числами, числами с плавающей точкой или указателями. Она возвращает половину суммы a и b, при этом не происходит переполнения.
Если a и b имеют целочисленный тип и сумма является нечетной, то результат округляется в сторону a. Если a и b имеют тип с плавающей точкой, то происходит не более одной неточной операции.
#код
Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены?
в C++ выбрасывать исключения из конструктора можно. Это обычно делается, когда в процессе инициализации объекта происходит ошибка, и объект не может быть корректно сконструирован.
Если исключение выбрасывается из конструктора, то все поля, которые были успешно сконструированы до момента выброса исключения, будут корректно разрушены. Это гарантируется механизмом исключений в C++.
Важно помнить, что только те поля, которые были успешно сконструированы, будут разрушены. Если исключение выбрасывается в процессе конструирования поля, то это поле не будет разрушено, так как его конструктор не был успешно завершен.
#вопросы_с_собеседований
в C++ выбрасывать исключения из конструктора можно. Это обычно делается, когда в процессе инициализации объекта происходит ошибка, и объект не может быть корректно сконструирован.
Если исключение выбрасывается из конструктора, то все поля, которые были успешно сконструированы до момента выброса исключения, будут корректно разрушены. Это гарантируется механизмом исключений в C++.
Важно помнить, что только те поля, которые были успешно сконструированы, будут разрушены. Если исключение выбрасывается в процессе конструирования поля, то это поле не будет разрушено, так как его конструктор не был успешно завершен.
#вопросы_с_собеседований
Позднее связывание
Позднее связывание (или динамическое связывание) — это концепция в C++, которая связывает вызов метода с его реализацией во время выполнения программы, а не на этапе компиляции. Это позволяет достичь полиморфизма и инкапсуляции, так как объекты могут вызывать методы, которые будут разрешены на основе их фактического типа, а не только статического типа.
В C++ позднее связывание реализуется с помощью виртуальных функций и ключевого слова virtual. Виртуальные функции определяются в базовом классе и могут быть переопределены в производных классах. Когда вы вызываете виртуальную функцию через указатель или ссылку на базовый класс, вызывается соответствующая реализация в производном классе на основе реального типа объекта.
#код
Позднее связывание (или динамическое связывание) — это концепция в C++, которая связывает вызов метода с его реализацией во время выполнения программы, а не на этапе компиляции. Это позволяет достичь полиморфизма и инкапсуляции, так как объекты могут вызывать методы, которые будут разрешены на основе их фактического типа, а не только статического типа.
В C++ позднее связывание реализуется с помощью виртуальных функций и ключевого слова virtual. Виртуальные функции определяются в базовом классе и могут быть переопределены в производных классах. Когда вы вызываете виртуальную функцию через указатель или ссылку на базовый класс, вызывается соответствующая реализация в производном классе на основе реального типа объекта.
#код
Статически подсчитываем количество экземпляров шаблона с нулевым временем выполнения и даже без использования стандартной библиотеки.
Смотреть код
Смотреть код
Ключевое слово const
Ключевое слово const используется для создания констант и неизменяемых объектов.
— Const для объявления переменных: запрещает изменение объекта после инициализации.
— Const указатели и ссылки: указатель или ссылка на константный объект. Нельзя изменить объект через них, только читать.
— Функции, возвращающие const значения: гарантируют, что функция не изменит объект.
— Const члены класса: нельзя изменить через объект класса.
— Const методы класса: не меняют члены класса. Часто применяются к getter-методам.
#код
Ключевое слово const используется для создания констант и неизменяемых объектов.
— Const для объявления переменных: запрещает изменение объекта после инициализации.
— Const указатели и ссылки: указатель или ссылка на константный объект. Нельзя изменить объект через них, только читать.
— Функции, возвращающие const значения: гарантируют, что функция не изменит объект.
— Const члены класса: нельзя изменить через объект класса.
— Const методы класса: не меняют члены класса. Часто применяются к getter-методам.
#код
Очередной #дайджест по С++:
✍️ Что в DI-Контейнере твоем, С++? Пробуем написать
Разбор DI-контейнеров на C++.
✍️ Установка OpenCV под Windows
В данной статье описан способ сборки OpenCV из исходников с помощью cmake и Microsoft Visual Studio, и пример запуска своего проекта на cmake.
✍️ Краткий обзор нововведений C++23: deducing this
Документ «deducing this», принятый в последний стандарт C++, вводит новый, третий тип методов классов, сочетающий в себе свойства двух уже существующих: нестатических и статических, открывающий перед нами новые горизонты.
✍️ Регулятор нагрузки
Данный регулятор управляется при помощи arduino и симисторного выхода.
✍️ Компилируем быстрые консольные .exe приложения на PHP 8.1 в 2023 году, а почему бы и нет?
С каждым релизом PHP становится всё быстрее, а при включении JIT (Just-In-Time) компиляции достигает почти отметок того же C.
✍️ Что в DI-Контейнере твоем, С++? Пробуем написать
Разбор DI-контейнеров на C++.
✍️ Установка OpenCV под Windows
В данной статье описан способ сборки OpenCV из исходников с помощью cmake и Microsoft Visual Studio, и пример запуска своего проекта на cmake.
✍️ Краткий обзор нововведений C++23: deducing this
Документ «deducing this», принятый в последний стандарт C++, вводит новый, третий тип методов классов, сочетающий в себе свойства двух уже существующих: нестатических и статических, открывающий перед нами новые горизонты.
✍️ Регулятор нагрузки
Данный регулятор управляется при помощи arduino и симисторного выхода.
✍️ Компилируем быстрые консольные .exe приложения на PHP 8.1 в 2023 году, а почему бы и нет?
С каждым релизом PHP становится всё быстрее, а при включении JIT (Just-In-Time) компиляции достигает почти отметок того же C.
Сколько лет опыта по вашему должен иметь мидл?
#интерактив
#интерактив
std::tuple
std::tuple — это шаблонный класс, представляющий собой фиксированный набор элементов разных типов. Проще говоря, удобный инструмент для упаковки данных разных типов
Элементы tuple инициализируются в конструкторе и доступны только для чтения после создания.
tuple часто используется в комбинации с tie для присваивания кортежа переменным.
#код
std::tuple — это шаблонный класс, представляющий собой фиксированный набор элементов разных типов. Проще говоря, удобный инструмент для упаковки данных разных типов
Элементы tuple инициализируются в конструкторе и доступны только для чтения после создания.
tuple часто используется в комбинации с tie для присваивания кортежа переменным.
#код
Что такое рефакторинг?
Рефакторинг — это процесс изменения внутренней структуры программы без изменения ее внешнего поведения.
Рефакторинг кода может применяться в следующих ситуациях:
— Улучшение читаемости и понятности кода.
— Оптимизация производительности.
— Устранение дублирования кода.
Рефакторинг особенно важен при работе над большими проектами, где код многократно изменяется и расширяется. Он позволяет поддерживать кодбейз чистым, современным и масштабируемым.
#вопросы_с_собеседований
Рефакторинг — это процесс изменения внутренней структуры программы без изменения ее внешнего поведения.
Рефакторинг кода может применяться в следующих ситуациях:
— Улучшение читаемости и понятности кода.
— Оптимизация производительности.
— Устранение дублирования кода.
Рефакторинг особенно важен при работе над большими проектами, где код многократно изменяется и расширяется. Он позволяет поддерживать кодбейз чистым, современным и масштабируемым.
#вопросы_с_собеседований
Паттерн Strategy
Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.
Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.
Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.
Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.
Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
lmdeploy
LMDeploy — это набор инструментов для сжатия, развертывания и обслуживания LLM.
Открыть страницу
LMDeploy — это набор инструментов для сжатия, развертывания и обслуживания LLM.
Открыть страницу
Сколько лет опыта по вашему должен иметь синьор?
#интерактив
#интерактив
RCU (Read-Copy-Update)
RCU (Read-Copy-Update) — это механизм синхронизации доступа к данным в многопоточных приложениях. Он позволяет избежать блокировок при чтении данных, делая копию для чтения и обновляя оригинал после того, как все чтения завершены.
RCU особенно полезен, когда чтение данных происходит гораздо чаще, чем запись.
В примере мы сначала берем rcu_read_lock, чтобы защитить чтение foo. В другом потоке происходит модификация foo с помощью rcu_assign_pointer, которая делает копию данных, а оригинал удаляется после synchronize_rcu.
Таким образом чтение в первом потоке происходит без блокировок и избегает конфликтов с изменением данных в другом потоке. RCU гарантирует, что указатель foo будет виден как старое значение в первом потоке.
#код
RCU (Read-Copy-Update) — это механизм синхронизации доступа к данным в многопоточных приложениях. Он позволяет избежать блокировок при чтении данных, делая копию для чтения и обновляя оригинал после того, как все чтения завершены.
RCU особенно полезен, когда чтение данных происходит гораздо чаще, чем запись.
В примере мы сначала берем rcu_read_lock, чтобы защитить чтение foo. В другом потоке происходит модификация foo с помощью rcu_assign_pointer, которая делает копию данных, а оригинал удаляется после synchronize_rcu.
Таким образом чтение в первом потоке происходит без блокировок и избегает конфликтов с изменением данных в другом потоке. RCU гарантирует, что указатель foo будет виден как старое значение в первом потоке.
#код
Очередной #дайджест по С++:
🤖 Circle может стать будущим C++
Один простой трюк, позволяющий освободить творческие способности в эволюции языка C++.
🤖 AgentBench
Комплексный тест для оценки LLM как агентов.
🤖 fuzzing
Учебники, примеры, обсуждения, исследовательские предложения и другие ресурсы, связанные с фаззингом.
🤖 Моделирование трубы в реальном времени
Создание полноценной симуляции.
🤖 Circle может стать будущим C++
Один простой трюк, позволяющий освободить творческие способности в эволюции языка C++.
🤖 AgentBench
Комплексный тест для оценки LLM как агентов.
🤖 fuzzing
Учебники, примеры, обсуждения, исследовательские предложения и другие ресурсы, связанные с фаззингом.
🤖 Моделирование трубы в реальном времени
Создание полноценной симуляции.
std::size
std::size — это функция из стандартной библиотеки C++, которая возвращает размер контейнера или массива.
Она определена в заголовочном файле, работает со всеми стандартными контейнерами (vector, deque, list, array и др.) и с массивами всех типов, позволяя получить размер контейнера или массива в runtime.
#код
std::size — это функция из стандартной библиотеки C++, которая возвращает размер контейнера или массива.
Она определена в заголовочном файле, работает со всеми стандартными контейнерами (vector, deque, list, array и др.) и с массивами всех типов, позволяя получить размер контейнера или массива в runtime.
#код