Какой из вариантов GetByKeyOrDefault является корректным?
Anonymous Poll
38%
1
34%
2
13%
3
16%
ни один
👆Пояснение к предыдущему вопросу
👨🏻💻 Отметим сразу, что первый вариант копирует возвращаемое значение и является корректным, проблем с
Второй вариант может быть корректным в некоторых случаях, но давайте рассмотрим следующий код.
Третий вариант имеет такую же проблему, что и второй, так как создаётся временная строка, и указатель внутри
Задачи и тесты по программированию | proghub
👨🏻💻 Отметим сразу, что первый вариант копирует возвращаемое значение и является корректным, проблем с
lifetime
не будет.Второй вариант может быть корректным в некоторых случаях, но давайте рассмотрим следующий код.
const auto& v = GetByKeyOrDefault2(m, k, "127.0.0.1")
будет типом const std::string&
и если вернётся дефолтное значение, то вернётся временный объект, который после вызова функции разрушится, что ведет к неопределённому поведению.Третий вариант имеет такую же проблему, что и второй, так как создаётся временная строка, и указатель внутри
std::string_view
протухнет после вызова.Задачи и тесты по программированию | proghub
Ускоренный отбор в Яндекс – Intern week offer 🔥
В рамках нового проекта начинающие разработчики смогут пройти собеседования и получить приглашение на стажировку всего за 7 дней. Чтобы пройти отбор, нужно решить контест, пройти технические секции и финалы.
Направления: Backend, Frontend или Mobile
Условия: стажировка оплачивается, длится от 3 до 6 месяцев, и вы можете выбрать занятость 20, 30 или 40 часов в неделю. Иногородним стажёрам мы оплачиваем проезд и проживание, а тех, кто хорошо себя проявит, будем рады видеть в штате.
Крайний срок подачи заявки и решения контеста – 30 октября.
👉Подать заявку: https://clck.ru/32VXKW
В рамках нового проекта начинающие разработчики смогут пройти собеседования и получить приглашение на стажировку всего за 7 дней. Чтобы пройти отбор, нужно решить контест, пройти технические секции и финалы.
Направления: Backend, Frontend или Mobile
Условия: стажировка оплачивается, длится от 3 до 6 месяцев, и вы можете выбрать занятость 20, 30 или 40 часов в неделю. Иногородним стажёрам мы оплачиваем проезд и проживание, а тех, кто хорошо себя проявит, будем рады видеть в штате.
Крайний срок подачи заявки и решения контеста – 30 октября.
👉Подать заявку: https://clck.ru/32VXKW
Что выведет программа?
Anonymous Quiz
4%
A
15%
B
42%
AB
13%
BA
25%
Не скомпилируется
2%
Неопределенное поведение
Что напечатает программа?
Anonymous Quiz
22%
1
12%
12
10%
2
14%
21
36%
Не скомпилируется
6%
Неопределенное поведение
👆Пояснение к предыдущему вопросу
👨🏻💻 Так как f находится в двух разных namespace, обычно такие вещи не компилируются, но тут нас ждёт страшный зверь под названием ADL.
Из-за ADL argument-dependent name lookup a.k.a. "Koenig lookup", поведение вполне нормальное.
С этой технологией, для lookup выбираются все namespace, которые перечислены в аргументах. Поэтому в данном случае мы рассмотрим только namespace x. Это сделано в основном для operator= и операторов сравнения, чтобы не надо было указывать namespace операторов, но к сожалению ведёт к достаточно сложным последствиям, если использование неправильно.
Задачи и тесты по программированию | proghub
👨🏻💻 Так как f находится в двух разных namespace, обычно такие вещи не компилируются, но тут нас ждёт страшный зверь под названием ADL.
Из-за ADL argument-dependent name lookup a.k.a. "Koenig lookup", поведение вполне нормальное.
С этой технологией, для lookup выбираются все namespace, которые перечислены в аргументах. Поэтому в данном случае мы рассмотрим только namespace x. Это сделано в основном для operator= и операторов сравнения, чтобы не надо было указывать namespace операторов, но к сожалению ведёт к достаточно сложным последствиям, если использование неправильно.
Задачи и тесты по программированию | proghub
Укажите performance проблему с этим кодом из представленных вариантов.
Anonymous Quiz
16%
push_back сделает копию возвращаемых значений. Надо использовать emplace_back
3%
Код содержит неопределенное поведение, так как ConvertData генерирует временный объект
22%
push_back сделает копию возвращаемых значений. Надо написать std::move(ConvertData(item))
41%
Размер вектора будет расти во время цикла, стоит сделать .reserve перед циклом
8%
Аргумент ConvertData будет скопирован при каждом вызове. Нужен аргумент, принимающий указатель
11%
Код оптимален, простых оптимизаций нет
👆Пояснение к предыдущему вопросу
👨🏻💻 В этом коде две проблемы -- первая, что в цикле
Во всём остальном оптимально. RVO (return value optimization) применяется во всех функциях, копирования при вызове Convert не происходит, а произойдёт просто навешивание ссылки.
👨🏻💻 В этом коде две проблемы -- первая, что в цикле
OtherData
будет копироваться, лучше сделать const OtherData& item
, вторая -- то, что вектор будет расти во время push_back
и стоит сделать reserve перед, чтобы не было слишком много аллокаций. Поэтому надо было выбрать второй вариант, так как первый отсутствовал.Во всём остальном оптимально. RVO (return value optimization) применяется во всех функциях, копирования при вызове Convert не происходит, а произойдёт просто навешивание ссылки.
push_back
создаст объект на месте, так как оно будет Rvalue.
Задачи и тесты по программированию | proghub👆Пояснение к предыдущему вопросу
👨🏻💻 Правильный ответ, что e будет являться временным объектом, так как итератор в std::map возвращает std::pair<const int, int>, поэтому произойдёт копирование пары, e будет временным объектом, который будет разрушаться и это является неопределённым поведением. См. value_type в https://en.cppreference.com/w/cpp/container/map
Все остальные ответы неправильные. const int* является константным по данным и присваивание корректно, если нет return statement из main, то оно по умолчанию ноль, а также main может быть без аргументов.
Задачи и тесты по программированию | proghub
👨🏻💻 Правильный ответ, что e будет являться временным объектом, так как итератор в std::map возвращает std::pair<const int, int>, поэтому произойдёт копирование пары, e будет временным объектом, который будет разрушаться и это является неопределённым поведением. См. value_type в https://en.cppreference.com/w/cpp/container/map
Все остальные ответы неправильные. const int* является константным по данным и присваивание корректно, если нет return statement из main, то оно по умолчанию ноль, а также main может быть без аргументов.
Задачи и тесты по программированию | proghub