#вопросы_с_собеседований
Что будет выведено и почему?
Ответ:
4294967271, предполагая 32-битные целые числа.
Почему так происходит?
Существует иерархия: long double, double, float, unsigned long int, long int, unsigned int, int. И когда два операнда определены как 25u (unsigned int) и 50 (int), 50 также будет интерпретироваться как беззнаковое целое число, то есть 50u.
Кроме того, результат операции также будет иметь тип операндов. Следовательно, результат 25u - 50u и сам является беззнаковым целым числом. Таким образом, результат -25 преобразуется в 4294967271.
Что будет выведено и почему?
Ответ:
Почему так происходит?
Существует иерархия: long double, double, float, unsigned long int, long int, unsigned int, int. И когда два операнда определены как 25u (unsigned int) и 50 (int), 50 также будет интерпретироваться как беззнаковое целое число, то есть 50u.
Кроме того, результат операции также будет иметь тип операндов. Следовательно, результат 25u - 50u и сам является беззнаковым целым числом. Таким образом, результат -25 преобразуется в 4294967271.
This media is not supported in your browser
VIEW IN TELEGRAM
Ускоряем рабочие процессы: оплачивайте Cursor через МТС Оплату ✨
Покупайте подписки для работы в пару кликов через СБП и с минимальной комиссией. Так же можно оплачивать ещё 150+ зарубежных сервисов: Replit, Sentry, Qodo, Warp, Windsurf и другие.
Весь процесс займёт не больше 5 минут. Пароли и лишние данные не нужны — только ваша почта. Оплачивайте сервисы и исправляйте баги вместе с МТС Оплатой 🤗
Покупайте подписки для работы в пару кликов через СБП и с минимальной комиссией. Так же можно оплачивать ещё 150+ зарубежных сервисов: Replit, Sentry, Qodo, Warp, Windsurf и другие.
Весь процесс займёт не больше 5 минут. Пароли и лишние данные не нужны — только ваша почта. Оплачивайте сервисы и исправляйте баги вместе с МТС Оплатой 🤗
#вопросы_с_собеседований
Что такое класс хранения?
Класс, который определяет срок существования, компоновку и расположение переменных/функций в памяти.
В C ++ поддерживаются такие классы хранения: auto, static, register, extern и mutable.
Обратите внимание, что register устарел для C++11. Для C++17 он был удален и зарезервирован для будущего использования.
Что такое класс хранения?
Класс, который определяет срок существования, компоновку и расположение переменных/функций в памяти.
В C ++ поддерживаются такие классы хранения: auto, static, register, extern и mutable.
Обратите внимание, что register устарел для C++11. Для C++17 он был удален и зарезервирован для будущего использования.
Оффер за 3 дня: будущее инженерии начинается в YADRO.
Запускаем SPRINT OFFER для C++ Software Engineer!
Мы ждем:
Талантливых инженеров с опытом работы на C/С++, уверенным знанием сетей TCP/IP и Linux.
Как принять участие?
1️⃣ Оставьте заявку до 19 октября и пройдите HR-скрининг
2️⃣ Пройдите техническое и менеджерское интервью
3️⃣ Получите оффер в течение 3 дней
О направлении:
Инженеры разрабатывают комплексную платформу для построения современных узлов сотовых сетей, включая базовые станции LTE и GSM. Создаваемая платформа обеспечивает управление всей телеком инфраструктурой: от прикладных компонентов до сетевой топологии.
💙 Не упускайте шанс присоединиться к интересному проекту и работать с инженерами мирового уровня! Успейте подать заявку до 19 октября по ссылке!
Запускаем SPRINT OFFER для C++ Software Engineer!
Мы ждем:
Талантливых инженеров с опытом работы на C/С++, уверенным знанием сетей TCP/IP и Linux.
Как принять участие?
1️⃣ Оставьте заявку до 19 октября и пройдите HR-скрининг
2️⃣ Пройдите техническое и менеджерское интервью
3️⃣ Получите оффер в течение 3 дней
О направлении:
Инженеры разрабатывают комплексную платформу для построения современных узлов сотовых сетей, включая базовые станции LTE и GSM. Создаваемая платформа обеспечивает управление всей телеком инфраструктурой: от прикладных компонентов до сетевой топологии.
Please open Telegram to view this post
VIEW IN TELEGRAM
Нам действительно нужно неопределенное поведение?
https://www.ralfj.de/blog/2021/11/24/ub-necessary.html
https://www.ralfj.de/blog/2021/11/24/ub-necessary.html
www.ralfj.de
Do we really need Undefined Behavior?
I recently published a blog post on why Undefined Behavior is actually not a bad idea. Coincidentally, this is just a few weeks after the publication of this paper by Victor Yodaiken which ...
std::unordered_set
Доступ к элементам
#для_начинающих
std::unordered_set — это ассоциативный контейнер, который содержит множество уникальных объектов типа Key. Это позволяет быстро получить доступ к отдельным элементам, поскольку после вычисления хэша он указывает на точный бакет, в который помещен элемент.std::unordered_set использует хэширование для хранения элементов. Это означает, что каждый элемент контейнера преобразуется в целое число, называемое хеш-значением. Хеш-значения элементов используются для размещения их в бакетах, которые представляют собой массивы элементов.Доступ к элементам
std::unordered_set осуществляется с помощью их хеш-значений. Это позволяет получить доступ к элементу за время O(1), что быстрее, чем у других ассоциативных контейнеров, таких как std::map и std::multimap.#для_начинающих
Requires-expression
Вот основные особенности requires-expression:
— Логическое выражение: Оценивается в
— Используется для проверки:
— Соответствия типам и выражениям концепциям.
— Других требований к типам и выражениям.
Применение:
— Внутри шаблонов.
— Внутри
— Вне шаблонов и
Преимущества использования requires-expression:
— Улучшение читаемости и понятности кода: Требования к типам и выражениям становятся более явными.
— Повышение безопасности кода: Ошибки, связанные с несоответствием типов, выявляются во время компиляции.
— Улучшение производительности: Константные проверки требований позволяют оптимизировать код.
#для_продвинутых
Requires-expression (выражение требований) – это мощная функциональность, появившаяся в C++20, которая позволяет выражать требования к типам и выражениям непосредственно в коде.Вот основные особенности requires-expression:
— Логическое выражение: Оценивается в
true или false во время компиляции.— Используется для проверки:
— Соответствия типам и выражениям концепциям.
— Других требований к типам и выражениям.
Применение:
— Внутри шаблонов.
— Внутри
constexpr функций.— Вне шаблонов и
constexpr функций (с ограничениями).Преимущества использования requires-expression:
— Улучшение читаемости и понятности кода: Требования к типам и выражениям становятся более явными.
— Повышение безопасности кода: Ошибки, связанные с несоответствием типов, выявляются во время компиляции.
— Улучшение производительности: Константные проверки требований позволяют оптимизировать код.
#для_продвинутых
Что такое PIMPL?
PIMPL (Pointer to Implementation) — это идиома проектирования в C++, которая используется для управления инкапсуляцией деталей реализации класса и сокрытия их от пользователей класса. Она также известна как «Cheshire Cat» (улыбка Чеширского кота) из-за того, что она позволяет «убрать» детали реализации из интерфейса класса, оставив только указатель на них.
Идея PIMPL заключается в том, чтобы внести все детали реализации класса в отдельную структуру или класс, а затем хранить указатель на эту структуру в основном классе. Таким образом, пользователи класса видят только публичный интерфейс основного класса, а детали реализации остаются скрытыми.
#для_продвинутых
PIMPL (Pointer to Implementation) — это идиома проектирования в C++, которая используется для управления инкапсуляцией деталей реализации класса и сокрытия их от пользователей класса. Она также известна как «Cheshire Cat» (улыбка Чеширского кота) из-за того, что она позволяет «убрать» детали реализации из интерфейса класса, оставив только указатель на них.
Идея PIMPL заключается в том, чтобы внести все детали реализации класса в отдельную структуру или класс, а затем хранить указатель на эту структуру в основном классе. Таким образом, пользователи класса видят только публичный интерфейс основного класса, а детали реализации остаются скрытыми.
#для_продвинутых
Карьерный буст, робот в подарок и призовой фонд 7 500 000 рублей 🤖
Успей зарегистрироваться до 20 октября.
Все это ждет участников трека «Программирование роботов» на всероссийском ИТ-чемпионате МТС True Tech Champ 2025. Присоединяйся, если пишешь на С++, Go, Python, JS, Java, C# или другом языке.
Соревнования пройдут в командах от 2 до 4 человек в несколько этапов:
— Квалификация. Тебе предстоит запрограммировать робота на прохождение виртуального лабиринта.
— Полуфинал. Ты будешь дистанционно управлять роботом на офлайн-полигоне и наблюдать за его перемещениями в трансляции.
— Финал. За две недели до финала организаторы отправят тебе настоящего робота для кастомизации. Ты сможешь модифицировать его, чтобы он оказался быстрее других в многоуровневом офлайн-лабиринте и смог выбить соперников с платформы в шоу-битве.
Команды финалистов получат по одному роботу Waveshare Cobra Flex в подарок и сразятся за крупные денежные призы: 4 000 000 ₽ за первое место, 2 500 000 ₽ за второе и 1 000 000 ₽ за третье.
Еще ты сможешь:
— Получить практический опыт работы с инструментами, с помощью которых создают домашних и промышленных роботов.
— Прокачать компетенции, которые помогут развиваться в ИТ.
— Заявить о себе на всю Россию и ускорить свой профессиональный рост.
📍 Финал состоится 21 ноября в МТС Live Холл в Москве.
👉🏻 Регистрируйся на сайте до 20 октября.
Успей зарегистрироваться до 20 октября.
Все это ждет участников трека «Программирование роботов» на всероссийском ИТ-чемпионате МТС True Tech Champ 2025. Присоединяйся, если пишешь на С++, Go, Python, JS, Java, C# или другом языке.
Соревнования пройдут в командах от 2 до 4 человек в несколько этапов:
— Квалификация. Тебе предстоит запрограммировать робота на прохождение виртуального лабиринта.
— Полуфинал. Ты будешь дистанционно управлять роботом на офлайн-полигоне и наблюдать за его перемещениями в трансляции.
— Финал. За две недели до финала организаторы отправят тебе настоящего робота для кастомизации. Ты сможешь модифицировать его, чтобы он оказался быстрее других в многоуровневом офлайн-лабиринте и смог выбить соперников с платформы в шоу-битве.
Команды финалистов получат по одному роботу Waveshare Cobra Flex в подарок и сразятся за крупные денежные призы: 4 000 000 ₽ за первое место, 2 500 000 ₽ за второе и 1 000 000 ₽ за третье.
Еще ты сможешь:
— Получить практический опыт работы с инструментами, с помощью которых создают домашних и промышленных роботов.
— Прокачать компетенции, которые помогут развиваться в ИТ.
— Заявить о себе на всю Россию и ускорить свой профессиональный рост.
📍 Финал состоится 21 ноября в МТС Live Холл в Москве.
👉🏻 Регистрируйся на сайте до 20 октября.
Флаг компиляции -fPIC
Флаг компиляции
Код с независимой позицией необходим для создания динамических библиотек, которые могут быть загружены в память в любое место. Это также полезно для создания разделяемых модулей, которые могут быть подключены к другим программам.
Чтобы использовать флаг
Это создаст исполняемый файл main, который может быть связан с другими библиотеками.
#для_продвинутых
Флаг компиляции
-fPIC в С++ означает «Position Independent Code» (код с независимой позицией). Этот флаг заставляет компилятор создавать код, который может быть связан с другими библиотеками, независимо от того, где они расположены в памяти.Код с независимой позицией необходим для создания динамических библиотек, которые могут быть загружены в память в любое место. Это также полезно для создания разделяемых модулей, которые могут быть подключены к другим программам.
Чтобы использовать флаг
-fPIC, необходимо добавить его в командную строку компилятора. Например, для компиляции файла main.cpp с использованием флага -fPIC можно использовать следующую команду:g++ -fPIC main.cpp -o main
Это создаст исполняемый файл main, который может быть связан с другими библиотеками.
#для_продвинутых
Forward_list
#для_продвинутых
Forward_list в C++ - это контейнер, поддерживающий быструю вставку и удаление элементов из любого места в контейнере. Быстрый доступ к случайным элементам не поддерживается. Реализуется как односвязный список. По сравнению с std::list этот контейнер обеспечивает более эффективное хранение памяти, когда двунаправленная итерация не требуется.Forward_list соответствует требованиям Container (за исключением члена функции size и того, что сложность оператора == всегда линейна), AllocatorAwareContainer и SequenceContainer.#для_продвинутых
std::format
Форматирование текста с помощью
Чтобы использовать
#для_начинающих
std::format — это функция в C++, которая используется для форматирования текста. Она может использоваться для вставки значений переменных, строк и других объектов в шаблон текста.Форматирование текста с помощью
std::format похоже на форматирование текста с помощью printf. Однако std::format более безопасный и эффективный, чем printf.Чтобы использовать
std::format, вам необходимо включить заголовочный файл <format>.#для_начинающих
ext_aggregate
Функция
Первый аргумент — это контейнер, над элементами которого необходимо вычислить агрегатную функцию.
Второй аргумент — это функция, которая определяет агрегатную функцию, которую необходимо вычислить.
Функция
#для_продвинутых
ext_aggregate — это функция, которая используется для вычисления агрегатных функций над элементами контейнера. Агрегатные функции — это функции, которые возвращают значение, основанное на значениях всех элементов контейнера. Например, функция sum() возвращает сумму всех элементов контейнера, а функция max() возвращает максимальное значение в контейнере.Функция
ext_aggregate принимает два аргумента:Первый аргумент — это контейнер, над элементами которого необходимо вычислить агрегатную функцию.
Второй аргумент — это функция, которая определяет агрегатную функцию, которую необходимо вычислить.
Функция
ext_aggregate возвращает значение, вычисленное агрегатной функцией.#для_продвинутых
#вопросы_с_собеседований
Может ли inline-функция быть рекурсивной в С++?
Да, inline-функция может быть рекурсивной в С++. Однако, компилятор может отказаться от встраивания рекурсивной функции, если это приведет к чрезмерному расходу памяти или времени.
Чтобы заставить компилятор встроить рекурсивную функцию, можно использовать директиву препроцессора
На картинке выше функция вычисляет факториал числа. При компиляции этой функции с помощью компилятора GCC с опцией -O2 будет получен следующий результат:
Это означает, что функция
Однако, если компилятор считает, что встраивание рекурсивной функции приведет к чрезмерному расходу памяти или времени, он может отказаться от этого. Например, если функция
Может ли inline-функция быть рекурсивной в С++?
Да, inline-функция может быть рекурсивной в С++. Однако, компилятор может отказаться от встраивания рекурсивной функции, если это приведет к чрезмерному расходу памяти или времени.
Чтобы заставить компилятор встроить рекурсивную функцию, можно использовать директиву препроцессора
#pragma inline_recursion(on).На картинке выше функция вычисляет факториал числа. При компиляции этой функции с помощью компилятора GCC с опцией -O2 будет получен следующий результат:
factorial(int) at factorial.cc:5
Это означает, что функция
factorial будет встроена в код.Однако, если компилятор считает, что встраивание рекурсивной функции приведет к чрезмерному расходу памяти или времени, он может отказаться от этого. Например, если функция
factorial вызывается очень часто, компилятор может решить, что встраивание функции приведет к избыточному дублированию кода. В этом случае компилятор будет использовать обычный вызов функции.Объясните разницу между глубоким и поверхностным копированием и приведите пример, когда каждый тип копирования может быть предпочтительнее.
Глубокое копирование создаёт новый объект, копируя все поля источника и рекурсивно создавая копии всех объектов, на которые эти поля ссылаются. Таким образом, все ссылки в копии ведут на отдельные объекты, не связанные с оригиналом. Поверхностное копирование создаёт новый объект, но копирует только значения полей на верхнем уровне. Если поля являются ссылками на другие объекты, то копия будет ссылаться на те же объекты, что и исходный.
Глубокое копирование предпочтительно, когда нужно полностью изолировать копию от оригинала, чтобы изменения в одном не влияли на другой. Поверхностное копирование эффективно, когда нужно сэкономить память или время на копирование, и если объекты, на которые есть ссылки, не изменяются или их изменения допустимы в обоих экземплярах.
#вопросы_с_собеседований
Глубокое копирование предпочтительно, когда нужно полностью изолировать копию от оригинала, чтобы изменения в одном не влияли на другой. Поверхностное копирование эффективно, когда нужно сэкономить память или время на копирование, и если объекты, на которые есть ссылки, не изменяются или их изменения допустимы в обоих экземплярах.
#вопросы_с_собеседований
Прочел на днях пост Вани Ходора (бэкенд-разработчик из Лавки) и вот что думаю. Мы привыкли думать про скорость как про «миллисекунды в графиках». Но speculative execution — про другое: про обещание. Обещание, что ваш продукт окажется там, где пользователь собирается быть, на полшага раньше него. Это и есть «магия» ощущения мгновенности.
Когда «спекуляция» — это фича, а не расточительство
Есть предсказуемый следующий шаг. Лента листается дальше, корзину после карточки товара открывают часто, фильтры в карте включают по типовым шаблонам. Если путь вероятен — предзагружайте.
Психология выигрыша больше, чем цена железа. Пользователь чувствует разницу между 800 мс и 80 мс сильнее, чем продукт-команда счет за CPU. Но только там, где эта разница влияет на удержание, конверсию, повтор.
Стоимость отказа низкая. Если «угадали» неправильно — легко выкинуть результат и не испортить состояние системы (идемпотентность, компенсации, отмены).
Формула грубо такая:
ожидаемая выгода = p(угадали) × выигрыш от скорости − (1 − p) × цена лишней работы.
Пока правая часть положительная — вы в плюсе.
Инженерные поручни (чтобы не сорваться)
Идемпотентность и отмена. Спекулятивные ветки должны быть безопасны к повтору и просто отменяемы (cancellation tokens, TTL на задания).
Бюджеты и приоритеты. Не «всегда префетчить», а «префетчить при свободных бюджетах»: квоты на пользователя/сессию/датацентр, классы приоритетов, circuit breakers.
Деградация и фолбэки. Нет бюджета — живём без спекуляции; нет сигналов — не угадываем.
Анти-шторм. Избегайте dogpile: джоб-коалесинг (одна задача на ключ), кэши с soft-TTL, jitter на обновления.
Наблюдаемость именно под спекуляцию. Отдельные метрики: hit-rate предсказаний, доля отменённых вычислений, «цена хита» (CPU/IO на один успешный предзагруженный ответ), влияние на p95/p99 основной ручки.
Сигналы лучше, чем хрустальный шар
Спекуляция не обязана быть «ML-магией». Начните с простых сигналов:
UI-хинты: вкладка «постинг» открыта → прогреть аплоад; виден блок «Похожие» → подгрузить их.
Поведенческие частоты: «после X часто делают Y» → прогреть Y.
Временные окна: топ-запросы часа/дня предвычислять пачками.
Когда эвристики исчерпаны — добавляйте модель. Но помните: для бизнеса важнее precision (не сжигать впустую), чем recall (угадать каждый шаг). Лучше 60% попаданий при дешёвой промашке, чем 90% с дорогой.
Экономика кэширования без самообмана
Управляйте свежестью. SLA на «мгновенность» ≠ SLA на «абсолютную актуальность». Делите ручки по требованиям к свежести, ставьте разные TTL/источники правды.
Локальный прогрев важнее «всё и сразу». Прогревать следующие 10 постов лучше, чем следующие 100, если это сохраняет p95 и батарейку пользователя.
Безопасность и этика (да, это сюда)
Спекуляция — это иногда пересылка/хранение того, что пользователь может быть захочет отправить. Значит:
явное согласие и прозрачность (особенно для медиа и PII),
шифрование на клиенте и в транзите,
уважение к лимитам устройства (сеть, батарея), доступность оффлайн.
Как начать завтра и не сжечь прод
Гипотеза → метрика → бюджет. «Если прогреем X, то конверсия в Y +N% при цене Z».
Теневой режим. Считать и отменять, не влияя на пользовательский ответ. Померили hit-rate и цену.
Маленький тумблер. 1–5% трафика, фича-флаг, откат за один клик.
Платформизируйте удачу. Вынесите в библиотеку/сервис: API «попроси спекуляцию», приоритеты, бюджеты, кэши, отмена, логирование.
Где ломаются хорошие идеи
Удвоили самые тяжёлые запросы «на всякий случай». Бюджетов нет — счёт растёт.
Спорная согласованность: кэш мгновенный, но устаревший → пользователь теряет доверие.
«Предсказываем всё» на мобильной сети → минус батарея и лояльность.
Нет идемпотентности → редкие гонки превращаются в баги с деньгами.
Спекулятивное исполнение — не трюк, а способ выразить заботу о времени пользователя. Это разговор бэкенда с продуктом на одном языке: «мы инвестируем ресурсы туда, где ускорение заметят и оценят».
Когда «спекуляция» — это фича, а не расточительство
Есть предсказуемый следующий шаг. Лента листается дальше, корзину после карточки товара открывают часто, фильтры в карте включают по типовым шаблонам. Если путь вероятен — предзагружайте.
Психология выигрыша больше, чем цена железа. Пользователь чувствует разницу между 800 мс и 80 мс сильнее, чем продукт-команда счет за CPU. Но только там, где эта разница влияет на удержание, конверсию, повтор.
Стоимость отказа низкая. Если «угадали» неправильно — легко выкинуть результат и не испортить состояние системы (идемпотентность, компенсации, отмены).
Формула грубо такая:
ожидаемая выгода = p(угадали) × выигрыш от скорости − (1 − p) × цена лишней работы.
Пока правая часть положительная — вы в плюсе.
Инженерные поручни (чтобы не сорваться)
Идемпотентность и отмена. Спекулятивные ветки должны быть безопасны к повтору и просто отменяемы (cancellation tokens, TTL на задания).
Бюджеты и приоритеты. Не «всегда префетчить», а «префетчить при свободных бюджетах»: квоты на пользователя/сессию/датацентр, классы приоритетов, circuit breakers.
Деградация и фолбэки. Нет бюджета — живём без спекуляции; нет сигналов — не угадываем.
Анти-шторм. Избегайте dogpile: джоб-коалесинг (одна задача на ключ), кэши с soft-TTL, jitter на обновления.
Наблюдаемость именно под спекуляцию. Отдельные метрики: hit-rate предсказаний, доля отменённых вычислений, «цена хита» (CPU/IO на один успешный предзагруженный ответ), влияние на p95/p99 основной ручки.
Сигналы лучше, чем хрустальный шар
Спекуляция не обязана быть «ML-магией». Начните с простых сигналов:
UI-хинты: вкладка «постинг» открыта → прогреть аплоад; виден блок «Похожие» → подгрузить их.
Поведенческие частоты: «после X часто делают Y» → прогреть Y.
Временные окна: топ-запросы часа/дня предвычислять пачками.
Когда эвристики исчерпаны — добавляйте модель. Но помните: для бизнеса важнее precision (не сжигать впустую), чем recall (угадать каждый шаг). Лучше 60% попаданий при дешёвой промашке, чем 90% с дорогой.
Экономика кэширования без самообмана
Управляйте свежестью. SLA на «мгновенность» ≠ SLA на «абсолютную актуальность». Делите ручки по требованиям к свежести, ставьте разные TTL/источники правды.
Локальный прогрев важнее «всё и сразу». Прогревать следующие 10 постов лучше, чем следующие 100, если это сохраняет p95 и батарейку пользователя.
Безопасность и этика (да, это сюда)
Спекуляция — это иногда пересылка/хранение того, что пользователь может быть захочет отправить. Значит:
явное согласие и прозрачность (особенно для медиа и PII),
шифрование на клиенте и в транзите,
уважение к лимитам устройства (сеть, батарея), доступность оффлайн.
Как начать завтра и не сжечь прод
Гипотеза → метрика → бюджет. «Если прогреем X, то конверсия в Y +N% при цене Z».
Теневой режим. Считать и отменять, не влияя на пользовательский ответ. Померили hit-rate и цену.
Маленький тумблер. 1–5% трафика, фича-флаг, откат за один клик.
Платформизируйте удачу. Вынесите в библиотеку/сервис: API «попроси спекуляцию», приоритеты, бюджеты, кэши, отмена, логирование.
Где ломаются хорошие идеи
Удвоили самые тяжёлые запросы «на всякий случай». Бюджетов нет — счёт растёт.
Спорная согласованность: кэш мгновенный, но устаревший → пользователь теряет доверие.
«Предсказываем всё» на мобильной сети → минус батарея и лояльность.
Нет идемпотентности → редкие гонки превращаются в баги с деньгами.
Спекулятивное исполнение — не трюк, а способ выразить заботу о времени пользователя. Это разговор бэкенда с продуктом на одном языке: «мы инвестируем ресурсы туда, где ускорение заметят и оценят».
Telegram
this->notes.
#highload
Есть такой паттерн speculative execution (⢄⠣⠌ ⠅⡠⢆⠒⢔⢄⢢⣀⠍ ⢃⠎⠚⡐⢰⡰⡰⡢⠲ ⢌⠥⠜⢅⠊⠃⡌⢈⡂⠰⡃ ⠡⡢ ⡅⠍ ⣄⡔⡘⡠⠉⠃⡆⢂⠓⠪⠩⢐⡠ ⡢⠩⢆⠱⠚⡡⢈⠦⡢⠕). Паттерн заключается в том, чтобы делать префетч данных ещё до того, как пользователь захочет что-то увидеть, чтобы в момент, когда он…
Есть такой паттерн speculative execution (⢄⠣⠌ ⠅⡠⢆⠒⢔⢄⢢⣀⠍ ⢃⠎⠚⡐⢰⡰⡰⡢⠲ ⢌⠥⠜⢅⠊⠃⡌⢈⡂⠰⡃ ⠡⡢ ⡅⠍ ⣄⡔⡘⡠⠉⠃⡆⢂⠓⠪⠩⢐⡠ ⡢⠩⢆⠱⠚⡡⢈⠦⡢⠕). Паттерн заключается в том, чтобы делать префетч данных ещё до того, как пользователь захочет что-то увидеть, чтобы в момент, когда он…
#вопросы_с_собеседований
Напишите программу на C++, которая запрашивает у пользователя два числа и выполняет одну из простых математических операций: сложение, вычитание, умножение или деление. Пользователь должен вводить операцию в виде символа (+, -, *, /).
Подсказка: Используйте конструкцию switch для выполнения различных операций.
Решение:
1. Переменные: Определить переменные для чисел и операции.
2. Ввод данных: Запросить у пользователя два числа и символ операции.
3. Выбор операции: Использовать switch для определения типа операции.
4. Выполнение операции: Выполнить выбранную операцию, учитывая возможные ошибки (деление на ноль).
5. Вывод результата: Вывести результат операции.
6. Обработка ошибок: В случае ошибки вывести сообщение и завершить программу.
7. Возвращение значения: Вернуть 0 при успешном завершении, ненулевой код при ошибке.
Напишите программу на C++, которая запрашивает у пользователя два числа и выполняет одну из простых математических операций: сложение, вычитание, умножение или деление. Пользователь должен вводить операцию в виде символа (+, -, *, /).
Подсказка: Используйте конструкцию switch для выполнения различных операций.
Решение:
2. Ввод данных: Запросить у пользователя два числа и символ операции.
3. Выбор операции: Использовать switch для определения типа операции.
4. Выполнение операции: Выполнить выбранную операцию, учитывая возможные ошибки (деление на ноль).
5. Вывод результата: Вывести результат операции.
6. Обработка ошибок: В случае ошибки вывести сообщение и завершить программу.
7. Возвращение значения: Вернуть 0 при успешном завершении, ненулевой код при ошибке.
#вопросы_с_собеседований
Что такое stack overflow?
stack overflow (переполнение стека) — это программная ошибка, которая возникает, когда программа пытается использовать больше памяти на стеке, чем доступно. Стэк — это область памяти, используемая для хранения локальной информации функций, таких как параметры, локальные переменные и возвращаемые значения.
Когда функция вызывается, ее адрес возврата сохраняется на стеке. Затем, когда функция завершается, ее адрес возврата восстанавливается из стека, и управление передается следующей функции в стеке вызовов.
Когда происходит переполнение стека, программа аварийно завершается. Это может привести к потере данных или даже к повреждению системы.
Что такое stack overflow?
stack overflow (переполнение стека) — это программная ошибка, которая возникает, когда программа пытается использовать больше памяти на стеке, чем доступно. Стэк — это область памяти, используемая для хранения локальной информации функций, таких как параметры, локальные переменные и возвращаемые значения.
Когда функция вызывается, ее адрес возврата сохраняется на стеке. Затем, когда функция завершается, ее адрес возврата восстанавливается из стека, и управление передается следующей функции в стеке вызовов.
Когда происходит переполнение стека, программа аварийно завершается. Это может привести к потере данных или даже к повреждению системы.