Задачи и тесты по программированию | proghub
2.42K subscribers
655 photos
16 videos
23 files
915 links
Публикуем задачи и вопросы для подготовки к собесу.

Сотрудничество: @cyberJohnny
Download Telegram
👆Пояснение к предыдущему вопросу

👨🏻‍💻 Это правда, что Stop может не позваться, но за Start может стоять специальная логика, которая может позвать Stop, это не самая важная проблема написанного кода. Самая важная -- при инициализации Derived, periodicclosure не знает, что исполнять, а так как vptr инициализируется после Base конструктора, но до конца Derived constructor, может случиться datarace https://stackoverflow.com/questions/6591859/when-does-the-vptr-pointing-to-vtable-get-initialized-for-a-polymorphic-class

Отсутствие виртуального деструктора тоже большая проблема, но она не приведёт к ошибке компиляции. Поэтому этот вариант выбирать не стоило. Остальные варианты разрешены стандартом.

Такие Race ловит ThreadSanitizer, см https://github.com/google/sanitizers/wiki/ThreadSanitizerPopularDataRaces#data-race-on-vptr-during-construction

Задачи и тесты по программированию | proghub
Что напечатает программа?
Anonymous Quiz
10%
0
49%
1
25%
2
16%
Не определено
👎1
Какой из вариантов GetByKeyOrDefault является корректным?
Anonymous Poll
38%
1
34%
2
13%
3
16%
ни один
👆Пояснение к предыдущему вопросу

👨🏻‍💻 Отметим сразу, что первый вариант копирует возвращаемое значение и является корректным, проблем с lifetime не будет.

Второй вариант может быть корректным в некоторых случаях, но давайте рассмотрим следующий код.

const auto& v = GetByKeyOrDefault2(m, k, "127.0.0.1") будет типом const std::string& и если вернётся дефолтное значение, то вернётся временный объект, который после вызова функции разрушится, что ведет к неопределённому поведению.

Третий вариант имеет такую же проблему, что и второй, так как создаётся временная строка, и указатель внутри std::string_view протухнет после вызова.

Задачи и тесты по программированию | proghub
👍2
Ускоренный отбор в Яндекс – Intern week offer 🔥

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

Направления: Backend, Frontend или Mobile

Условия: стажировка оплачивается, длится от 3 до 6 месяцев, и вы можете выбрать занятость 20, 30 или 40 часов в неделю. Иногородним стажёрам мы оплачиваем проезд и проживание, а тех, кто хорошо себя проявит, будем рады видеть в штате.

Крайний срок подачи заявки и решения контеста – 30 октября.

👉Подать заявку: https://clck.ru/32VXKW
👍3
👆Пояснение к предыдущему вопросу

👨🏻‍💻 Так как f находится в двух разных namespace, обычно такие вещи не компилируются, но тут нас ждёт страшный зверь под названием ADL.

Из-за ADL argument-dependent name lookup a.k.a. "Koenig lookup", поведение вполне нормальное.

С этой технологией, для lookup выбираются все namespace, которые перечислены в аргументах. Поэтому в данном случае мы рассмотрим только namespace x. Это сделано в основном для operator= и операторов сравнения, чтобы не надо было указывать namespace операторов, но к сожалению ведёт к достаточно сложным последствиям, если использование неправильно.

Задачи и тесты по программированию | proghub
👆Пояснение к предыдущему вопросу

👨🏻‍💻 В этом коде две проблемы -- первая, что в цикле OtherData будет копироваться, лучше сделать const OtherData& item, вторая -- то, что вектор будет расти во время push_back и стоит сделать reserve перед, чтобы не было слишком много аллокаций. Поэтому надо было выбрать второй вариант, так как первый отсутствовал.

Во всём остальном оптимально. RVO (return value optimization) применяется во всех функциях, копирования при вызове Convert не происходит, а произойдёт просто навешивание ссылки. push_back создаст объект на месте, так как оно будет Rvalue.

Задачи и тесты по программированию | proghub