Сегодня получил интересный вопрос: что быстрее —
Ответ: n++ читает стек 3 раза, в то время как ++n и n + 1 — 4 раза.
Тесты были проведены на следующем коде (смотри фото):
++n и n + 1
Для
> n инкрементируется на стеке
> значение n загружается в регистр
> регистр сохраняется в dummy на стеке
n++
Для
> n загружается в регистр-1
> регистр-1 инкрементируется и результат сохраняется в регистр-2
> регистр-2 сохраняется обратно на стек (обновлённое значение n)
> регистр-1 сохраняется на стек в dummy (исходное значение n)
Может показаться, что код для n++ содержит больше инструкций и поэтому должен быть медленнее, но это не так.
На практике не существует такого понятия, как «инкремент на стеке» — значение фактически загружается в процессор, инкрементируется там, а затем записывается обратно.
Если посчитать обращения к стеку (чтения и записи):
> ++n и n + 1: чтение, запись, чтение, запись — 4 обращения к стеку
> n++: чтение, запись, запись — 3 обращения к стеку
Поскольку чтение из регистра значительно быстрее, чем из стека, это делает n++ более быстрым вариантом.🐸
👉 @Cpportal
n++
, ++n
или n + 1
?Ответ: n++ читает стек 3 раза, в то время как ++n и n + 1 — 4 раза.
Тесты были проведены на следующем коде (смотри фото):
++n и n + 1
Для
dummy = ++n
и n = n + 1; dummy = n
происходит следующее:> n инкрементируется на стеке
> значение n загружается в регистр
> регистр сохраняется в dummy на стеке
n++
Для
dummy = n++
происходит следующее:> n загружается в регистр-1
> регистр-1 инкрементируется и результат сохраняется в регистр-2
> регистр-2 сохраняется обратно на стек (обновлённое значение n)
> регистр-1 сохраняется на стек в dummy (исходное значение n)
Может показаться, что код для n++ содержит больше инструкций и поэтому должен быть медленнее, но это не так.
На практике не существует такого понятия, как «инкремент на стеке» — значение фактически загружается в процессор, инкрементируется там, а затем записывается обратно.
Если посчитать обращения к стеку (чтения и записи):
> ++n и n + 1: чтение, запись, чтение, запись — 4 обращения к стеку
> n++: чтение, запись, запись — 3 обращения к стеку
Поскольку чтение из регистра значительно быстрее, чем из стека, это делает n++ более быстрым вариантом.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Представьте себе игру, в которой вся логика выполняется на этапе компиляции:
никакой обработки во время выполнения, никакого динамического выделения памяти — только чистая магия
Автор реализовал игру в стиле «три в ряд» (аналогичную Candy Crush Saga) с использованием исключительно возможностей компиляции C++17 - смотреть😨
👉 @Cpportal
никакой обработки во время выполнения, никакого динамического выделения памяти — только чистая магия
constexpr
Автор реализовал игру в стиле «три в ряд» (аналогичную Candy Crush Saga) с использованием исключительно возможностей компиляции C++17 - смотреть
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Изучай разработку ОС, это реально увлекательно
Функция
Когда выполнение доходит до brk, обработчик перехватывает исключение, получает доступ к регистрам потока, модифицирует x0, подставляя нужное значение возврата, продвигает счётчик инструкций, чтобы пропустить ловушку, и выполнение продолжается.
В комбинации с остальной частью моего кода это обеспечивает патчинг во время выполнения, интроспекцию ВМ и метаморфное выполнение кода.🐸
👉 @Cpportal
Функция
breakpoint_handler()
устанавливает обработчик исключений, который перехватывает инструкции brk
, выполняемые внутри целевого процесса. Здесь написана отдельная функция patch()
, — она внедряет трамплин в исполняемую область памяти, и этот трамплин содержит инструкцию brk
в качестве ловушки.Когда выполнение доходит до brk, обработчик перехватывает исключение, получает доступ к регистрам потока, модифицирует x0, подставляя нужное значение возврата, продвигает счётчик инструкций, чтобы пропустить ловушку, и выполнение продолжается.
В комбинации с остальной частью моего кода это обеспечивает патчинг во время выполнения, интроспекцию ВМ и метаморфное выполнение кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Обратите внимание на интересную статью Ульриха Дреппера, в которой рассматриваются системы компьютерной памяти и их значение для разработчиков программного обеспечения.
Понимание этих концепций критически важно, если вы стремитесь создавать высокоэффективное ПО.
В статье рассматриваются:
> Кэш-память CPU — зачем она нужна и как оптимизировать её использование для ускоренного доступа к данным.
> Виртуальная память — как происходит управление памятью на низком уровне и что это означает для ваших приложений.
> Шаблоны доступа к памяти — ключ к написанию эффективного кода заключается в понимании иерархии памяти.
> Инструменты для анализа производительности — практические советы по использованию инструментов для выявления и устранения узких мест, связанных с памятью.
> Блокировки (locks) — понимание влияния многопоточности на работу с памятью.
> Многопоточность и память — как неравномерный доступ к памяти (NUMA) влияет на производительность программ на современных многопроцессорных системах.
По мере роста требований к ПО и увеличения разрыва в скорости между CPU и памятью, грамотное управление доступом к памяти становится ключевым фактором производительности.
Это обязательный материал для разработчиков, стремящихся к низкоуровневым оптимизациям💯
👉 @Cpportal
Понимание этих концепций критически важно, если вы стремитесь создавать высокоэффективное ПО.
В статье рассматриваются:
> Кэш-память CPU — зачем она нужна и как оптимизировать её использование для ускоренного доступа к данным.
> Виртуальная память — как происходит управление памятью на низком уровне и что это означает для ваших приложений.
> Шаблоны доступа к памяти — ключ к написанию эффективного кода заключается в понимании иерархии памяти.
> Инструменты для анализа производительности — практические советы по использованию инструментов для выявления и устранения узких мест, связанных с памятью.
> Блокировки (locks) — понимание влияния многопоточности на работу с памятью.
> Многопоточность и память — как неравномерный доступ к памяти (NUMA) влияет на производительность программ на современных многопроцессорных системах.
По мере роста требований к ПО и увеличения разрыва в скорости между CPU и памятью, грамотное управление доступом к памяти становится ключевым фактором производительности.
Это обязательный материал для разработчиков, стремящихся к низкоуровневым оптимизациям
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
На заметку вам: roadmap.sh/cpp
Это интерактивная, модульная дорожная карта изучения C++: от азов до продвинутых практик, с упором на последовательность, прогресс и полезный контент
🚶♀️ 🚶♀️ 🚶♀️
👉 @Cpportal
Это интерактивная, модульная дорожная карта изучения C++: от азов до продвинутых практик, с упором на последовательность, прогресс и полезный контент
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание игр заставляет осваивать новые технологии и решать реальные задачи. 😳
В этом курсе Эрик Юзва показывает, как с помощью C и Raylib сделать игру в стиле match-3 с графикой, музыкой и системой очков
👉 @Cpportal
В этом курсе Эрик Юзва показывает, как с помощью C и Raylib сделать игру в стиле match-3 с графикой, музыкой и системой очков
Please open Telegram to view this post
VIEW IN TELEGRAM
Архитектура компьютера: Продвинутое проектирование процессоров
На основе базовых знаний о скалярном RISC-конвейере, эти видео последовательно развивают концепции, ведущие к технологиям, лежащим в основе современных динамических внеочередных (out-of-order) суперскалярных процессоров
⏩ Источник
👉 @Cpportal
На основе базовых знаний о скалярном RISC-конвейере, эти видео последовательно развивают концепции, ведущие к технологиям, лежащим в основе современных динамических внеочередных (out-of-order) суперскалярных процессоров
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Нашёл репозиторий с кучей небольших упражнений и проектов по программированию, чтобы помочь тебе начать с языка C. Отлично подойдёт для новичков — пользуйся 🧠
👉 @Cpportal
Please open Telegram to view this post
VIEW IN TELEGRAM
Вот «Реверс-инжиниринг для всех». Эта отличная небольшая онлайн-книга обучает реверс-инжинирингу и заодно предлагает одно из лучших руководств по ассемблеру, которые я встречал. Уже ради этого стоит её прочитать — попробуйте 😱
👉 @Cpportal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Создан терминальный MP3-плеер с визуализацией спектра в виде радужного спектра в реальном времени.
Это реализовано через обработку аудио в реальном времени — вычисляются 32 частотные полосы, каждая из которых отображается с помощью HSV-цветов🙂
👉 @Cpportal
Это реализовано через обработку аудио в реальном времени — вычисляются 32 частотные полосы, каждая из которых отображается с помощью HSV-цветов
Please open Telegram to view this post
VIEW IN TELEGRAM