std::thread
std::thread является частью стандартной библиотеки C++ и предоставляет возможность создания и управления потоками выполнения. Он позволяет запускать функции в отдельных потоках, обеспечивая параллельное выполнение кода.
Обратите внимание, что после создания потока
В приведенном примере мы использовали j
std::thread является частью стандартной библиотеки C++ и предоставляет возможность создания и управления потоками выполнения. Он позволяет запускать функции в отдельных потоках, обеспечивая параллельное выполнение кода.
Обратите внимание, что после создания потока
std::thread, вы должны вызвать join() или detach() для корректной обработки завершения потока. В приведенном примере мы использовали j
oin(), чтобы основной поток дождался завершения потока t1. Если вы вызываете join() после завершения потока, программа может выдать исключение или вызвать неопределенное поведение.#вопросы_с_собеседований
Какие преимущества композиции перед наследованием?
Композиция в c++ позволяет создавать новый класс из более мелких существующих классов, тогда как наследование от других классов позволяет использовать существующие свойства класса.
Основное преимущество композиции заключается в том, что она обеспечивает более гибкую архитектуру и более легкое изменение поведения класса в будущем.
В то время как если использовать наследование при проектировании классов, то это может ограничить возможности изменений в будущем и привести к большему количеству ошибок в программе.
Какие преимущества композиции перед наследованием?
Основное преимущество композиции заключается в том, что она обеспечивает более гибкую архитектуру и более легкое изменение поведения класса в будущем.
В то время как если использовать наследование при проектировании классов, то это может ограничить возможности изменений в будущем и привести к большему количеству ошибок в программе.
template
Ключевое слово template используется в шаблонных функциях и классах для определения обобщённых типов данных, которые могут быть использованы при разработке универсальных алгоритмов.
В этом примере мы определяем шаблонную функцию
Несмотря на то, что
Это означает, что при использовании шаблонов и при неудачной попытке их инстанцирования компилятор не сгенерирует ошибку, а будет искать альтернативные варианты. Использование этой концепции позволяет более гибко управлять перегрузками функций и классов, что может быть особенно полезно при написании библиотек или фреймворков.
Ключевое слово template используется в шаблонных функциях и классах для определения обобщённых типов данных, которые могут быть использованы при разработке универсальных алгоритмов.
В этом примере мы определяем шаблонную функцию
max с типом данных T. Эта функция принимает два аргумента типа T и возвращает значение типа T, которое является максимальным. В вызове функции T будет заменено на фактический тип данных, переданный в качестве параметра шаблона.Несмотря на то, что
template используется для объявления шаблонных классов и функций, он может также применяться для реализации SFINAE. Это означает, что при использовании шаблонов и при неудачной попытке их инстанцирования компилятор не сгенерирует ошибку, а будет искать альтернативные варианты. Использование этой концепции позволяет более гибко управлять перегрузками функций и классов, что может быть особенно полезно при написании библиотек или фреймворков.
#вопросы_с_собеседований
Что случится, если exception выйдет за пределы потока?
Если exception выходит за пределы потока, то оно не может быть обработано на текущем уровне, т. к. он уже завершен. В таком случае исключение будет зарегистрировано как неперехваченное и может привести к аварийному завершению программы.
Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан.
Что случится, если exception выйдет за пределы потока?
Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан.
PIMPL (Pointer to Implementation)
PIMPL — это паттерн программирования, который позволяет скрыть внутреннюю реализацию класса от клиента, а также упростить перекомпиляцию кода и улучшить производительность.
Суть PIMPL-паттерна заключается в том, что все данные хранятся в отдельном класс, а в основном хранится только указатель на этот вспомогательный класс, в котором осуществляется вся работа с данными.
В данном примере пользователь класса
PIMPL — это паттерн программирования, который позволяет скрыть внутреннюю реализацию класса от клиента, а также упростить перекомпиляцию кода и улучшить производительность.
Суть PIMPL-паттерна заключается в том, что все данные хранятся в отдельном класс, а в основном хранится только указатель на этот вспомогательный класс, в котором осуществляется вся работа с данными.
В данном примере пользователь класса
MyObject не видит внутреннюю реализацию объекта, что позволяет добавлять/удалять поля без необходимости изменять интерфейс класса. Работа с внутренними данными осуществляется через методы класса Impl, которые вызываются в функциях-членах класса MyObject.#вопросы_с_собеседований
Какие примитивы синхронизации реализованы в C++?
В с++ реализовано множество примитивов синхронизации, ниже представлены их предназначения:
Какие примитивы синхронизации реализованы в C++?
В с++ реализовано множество примитивов синхронизации, ниже представлены их предназначения:
Mutex - используется для блокировки мьютекса при доступе к разделяемому ресурсу.lockguard и uniquelock - используются для автоматической блокировки и разблокировки мьютекса. condition_variable - используется для уведомления потоков о состоянии разделяемого ресурса.atomic - используется для атомарной операции с переменными.semaphore - используется для синхронизации доступа к ограниченному количеству ресурсов.barrier - используется для синхронизации потоков, когда все потоки должны достичь определенной точки их выполнения перед тем, как продолжить работу.#вопросы_с_собеседований
Какие есть особенности работы с shared memory?
Работа с разделяемой памятью (shared memory) предполагает использование операций чтения и записи данных в общую область памяти, которая разделяется между несколькими процессами.
Среди особенностей можно выделить основные:
Синхронизация доступа к этой памяти должна происходить с помощью механизмов синхронизации, иначе возможны ситуации, когда несколько процессов одновременно пытаются получить доступ к одним данным.
Кроме того, при работе с shared memory необходимо учитывать, что изменения данных в одном процессе автоматически не отображаются в других процессах. Для обновления данных необходимо явно синхронизироваться между процессами.
Также необходимо учитывать, что при работе с shared memory необходимо правильно управлять выделением и освобождением памяти, чтобы избежать утечек памяти и других проблем, связанных с неправильной работой с памятью.
Какие есть особенности работы с shared memory?
Работа с разделяемой памятью (shared memory) предполагает использование операций чтения и записи данных в общую область памяти, которая разделяется между несколькими процессами.
Среди особенностей можно выделить основные:
Синхронизация доступа к этой памяти должна происходить с помощью механизмов синхронизации, иначе возможны ситуации, когда несколько процессов одновременно пытаются получить доступ к одним данным.
Кроме того, при работе с shared memory необходимо учитывать, что изменения данных в одном процессе автоматически не отображаются в других процессах. Для обновления данных необходимо явно синхронизироваться между процессами.
Также необходимо учитывать, что при работе с shared memory необходимо правильно управлять выделением и освобождением памяти, чтобы избежать утечек памяти и других проблем, связанных с неправильной работой с памятью.
#вопросы_с_собеседований
Что такое Undefined behavior?
Undefined behavior - это непредсказуемое поведение программы , которое происходит, когда в коде содержится операция, которая не определена стандартом языка.
Такое поведение может возникнуть, когда код пытается обратиться к неопределенной переменной, делить на ноль, выходить за пределы массива или выполнять другие операции, которые противоречат правилам языка.
Ошибки в таком коде могут проявляться разнообразными способами, включая прекращение работы программы, непредсказуемые выходные данные, повреждение памяти или даже повреждение операционной системы. Избегайте Undefined behavior в своем коде, чтобы обеспечить надежность и безопасность системы.
Что такое Undefined behavior?
Такое поведение может возникнуть, когда код пытается обратиться к неопределенной переменной, делить на ноль, выходить за пределы массива или выполнять другие операции, которые противоречат правилам языка.
Ошибки в таком коде могут проявляться разнообразными способами, включая прекращение работы программы, непредсказуемые выходные данные, повреждение памяти или даже повреждение операционной системы. Избегайте Undefined behavior в своем коде, чтобы обеспечить надежность и безопасность системы.
std::make_shared
std::make_shared - это стандартная функция, используемая для создания объектов типа std::shared_ptr. Она позволяет создавать объекты типа
В этом примере мы создаем класс
std::make_shared - это стандартная функция, используемая для создания объектов типа std::shared_ptr. Она позволяет создавать объекты типа
std::shared_ptr без использования оператора new. Это сокращает код и упрощает его читаемость.В этом примере мы создаем класс
MyClass, имеющий поле value и метод Print(), выводящий значение поля value на консоль. Затем мы используем std::make_shared для создания объекта типа std::shared_ptr:std::make_shared<MyClass>(42);*Обратите внимание, что таким способом созданный объект
MyClass будет автоматически удален, когда на него не останется ссылок, даже если в вашем коде не указано delete.⚡️ Стартовал прием заявок на Технологический конкурс НТИ Up Great «Экстренный поиск»!
Участникам предстоит преодолеть комплексный технологический барьер, предусматривающий разработку технологий и технических решений, объединенных в единую систему, позволяющую эффективно использовать техническое зрение при поиске пропавших людей с применением беспилотных воздушных судов (БВС).
На первом этапе (Сателлит №1) участникам необходимо разработать программное решение для поиска объектов (людей) на изображениях, полученных с БВС.
Призовой фонд Сателлита №1 составляет 5 млн руб.
Лучшим командам, удовлетворяющим требованиям технического регламента, организаторами будут предоставлены БВС для участия во втором этапе (Сателлит №2) и финале конкурса.
Призерами и победителями могут стать только налоговые резиденты РФ.
📲 Заявки на Сателлит № 1 принимаются до 12 июня 2023 г. по ссылке.
Конкурс организуется совместно МФТИ, Фондом НТИ и добровольческим поисково-спасательным отрядом «ЛизаАлерт». Общий призовой фонд составляет 135 млн руб.
Участникам предстоит преодолеть комплексный технологический барьер, предусматривающий разработку технологий и технических решений, объединенных в единую систему, позволяющую эффективно использовать техническое зрение при поиске пропавших людей с применением беспилотных воздушных судов (БВС).
На первом этапе (Сателлит №1) участникам необходимо разработать программное решение для поиска объектов (людей) на изображениях, полученных с БВС.
Призовой фонд Сателлита №1 составляет 5 млн руб.
Лучшим командам, удовлетворяющим требованиям технического регламента, организаторами будут предоставлены БВС для участия во втором этапе (Сателлит №2) и финале конкурса.
Призерами и победителями могут стать только налоговые резиденты РФ.
📲 Заявки на Сателлит № 1 принимаются до 12 июня 2023 г. по ссылке.
Конкурс организуется совместно МФТИ, Фондом НТИ и добровольческим поисково-спасательным отрядом «ЛизаАлерт». Общий призовой фонд составляет 135 млн руб.
#вопросы_с_собеседований
На сколько потоков лучше разбить задачу? От чего это зависит?
Задачу лучше разбить на потоки таким образом, чтобы максимально эффективно использовать ресурсы процессора. Количество потоков зависит от общей нагрузки на систему, количества доступных ядер процессора и оптимизации потоков, чтобы избежать блокировки или гонки за ресурсы.
В целом, количество потоков должно быть достаточным для обработки задачи в максимально короткие сроки, но не должно превышать количество доступных ядер процессора. При выборе количества потоков нужно учитывать также характеристики задачи, например, объем данных, степень их зависимости и работу с разделяемыми ресурсами.
На сколько потоков лучше разбить задачу? От чего это зависит?
В целом, количество потоков должно быть достаточным для обработки задачи в максимально короткие сроки, но не должно превышать количество доступных ядер процессора. При выборе количества потоков нужно учитывать также характеристики задачи, например, объем данных, степень их зависимости и работу с разделяемыми ресурсами.
#вопросы_с_собеседований
Что такое stack overflow?
Переполнение стэка (stack overflow) – это ошибка, которая возникает, когда программа сохраняет больше данных на стеке, чем зарезервировано памяти. В результате переполнения стэка может произойти остановка программы или аварийное завершение работы.
Это часто происходит в малых приложениях с ограниченным количеством памяти. Для предотвращения такого рода ошибок следует бережно рассчитывать размер стека при проектировании и написании кода программы.
Что такое stack overflow?
Это часто происходит в малых приложениях с ограниченным количеством памяти. Для предотвращения такого рода ошибок следует бережно рассчитывать размер стека при проектировании и написании кода программы.
vtable (virtual function table)
vtable — это механизм динамического связывания для языка программирования C++ и его объектно-ориентированного подхода.
С помощью
vtable — это механизм динамического связывания для языка программирования C++ и его объектно-ориентированного подхода.
vtable содержит адреса виртуальных функций, определенных в базовом классе, которые используются для вызова соответствующих функций в производных классах, когда объект передается как указатель или ссылка на базовый класс.С помощью
vtable C++ позволяет создавать более эффективные и гибкие программы, предоставляя возможность для динамической диспетчеризации функций, основанной на типе объекта, переданного в качестве параметра.vptr (Virtual Pointer)
vptr — это указатель на виртуальную таблицу, которая содержит информацию о виртуальных функциях класса. vptr используется при вызове виртуальных функций, а также при операции приведения типов с помощью
В этом примере мы создали два класса:
Затем вызываем функцию
Результатом будет вывод "Derived", так как мы переопределили функцию в классе
vptr — это указатель на виртуальную таблицу, которая содержит информацию о виртуальных функциях класса. vptr используется при вызове виртуальных функций, а также при операции приведения типов с помощью
dynamic_cast.В этом примере мы создали два класса:
Base и Derived. Класс Derived наследуется от класса Base и переопределяет его виртуальную функцию func(). Затем мы создали объект класса Derived и присвоили его адрес указателю на базовый класс Base. Затем вызываем функцию
func() с помощью указателя на базовый класс. Здесь vptr смотрит на таблицу виртуальных функций, чтобы определить, какую функцию вызывать. Результатом будет вывод "Derived", так как мы переопределили функцию в классе
Derived.std::unordered_multimap
std::unordered_multimap - это структура данных, которая представляет собой неупорядоченную хэш-таблицу, содержащую пары ключ-значение. Она подобна
Для использования нужно включить заголовочный файл
Чтобы получить значение элемента по ключу, можно воспользоваться методом
std::unordered_multimap - это структура данных, которая представляет собой неупорядоченную хэш-таблицу, содержащую пары ключ-значение. Она подобна
std::unordered_map, но может содержать несколько элементов с одинаковым ключом.Для использования нужно включить заголовочный файл
<unordered_map> и указать типы ключа и значения, например:std::unordered_multimap<std::string, int> myMap
В примере последний insert добавляет элемент с ключом "third", но так как элемент с таким ключом уже есть, то он будет добавлен в то же место (то есть этот ключ будет иметь два значения - 3 и 4).Чтобы получить значение элемента по ключу, можно воспользоваться методом
find — в примере он найдет элементы с ключом "third" и выведет их значения (3 и 4).#вопросы_с_собеседований
Что такое deadlock?
Deadlock - это ситуация, когда два или более процесса блокируют друг друга, ожидая освобождения ресурсов, которые удерживают другие процессы. При deadlock нет возможности продолжить работу ни одному из этих процессов без вмешательства со стороны системы или приложения.
Эта проблема может возникнуть при работе с разделяемыми ресурсами, такими как потоки, файлы, сетевые соединения и т. д., и ее решение требует особого внимания и организации кода.
Что такое deadlock?
Эта проблема может возникнуть при работе с разделяемыми ресурсами, такими как потоки, файлы, сетевые соединения и т. д., и ее решение требует особого внимания и организации кода.
Просмотр все файлов в папке с помощью C++
Для того, чтобы просмотреть все файлы в папке с помощью C++, можно использовать функцию
В данном примере мы получаем текущую директорию с помощью функции
Для того, чтобы просмотреть все файлы в папке с помощью C++, можно использовать функцию
std::filesystem::directory_iterator(). Данная функция позволяет перебирать все файлы в указанной директории.В данном примере мы получаем текущую директорию с помощью функции
fs::current_path(), а затем проходим по всем файлам в этой директории с помощью цикла for. Внутри цикла мы выводим путь к каждому файлу с помощью метода entry.path().#вопросы_с_собеседований
Как определить, что в программе есть memory leak?
В программе на C++ можно определить наличие memory leak с помощью использования инструментов для анализа памяти, таких как Valgrind или AddressSanitizer. Другим возможным способом является использование кода, который автоматически отслеживает выделение и освобождение памяти. Можно также использовать дебаггер или профилирование, чтобы выявить проблемы с памятью.
Важно понимать, что memory leak может привести к утечке ресурсов и ухудшению производительности приложения, поэтому необходимо тщательно мониторить использование памяти и обнаруживать любые проблемы сразу.
Как определить, что в программе есть memory leak?
Важно понимать, что memory leak может привести к утечке ресурсов и ухудшению производительности приложения, поэтому необходимо тщательно мониторить использование памяти и обнаруживать любые проблемы сразу.
#вопросы_с_собеседований
В чем разница между git fetch и git pull?
Разница между этими командами заключается в том, что когда вы используете команду
А команда
В чем разница между git fetch и git pull?
Разница между этими командами заключается в том, что когда вы используете команду
git fetch, Git извлекает последние изменения из удаленного репозитория в ваш локальный репозиторий, но оставляет эти изменения в отдельной ветке git origin. А команда
git pull извлекает и интегрирует (скачивает и сливает) последние изменения из удаленного репозитория в вашу текущую ветку работы.Семантика перемещения
Семантика перемещения - это концепция, введенная в C++11, которая позволяет компилятору оптимизировать копирование объектов, когда исходный объект не будет использоваться дальше. Это достигается с помощью специальных конструкторов и операторов присваивания, называемых перемещающими конструкторами и перемещающими операторами присваивания.
Перемещение позволяет избежать ненужного копирования ресурсов, таких как динамически выделенная память или файловые дескрипторы, и улучшает производительность программы. Вместо копирования ресурсов, перемещение передает их из одного объекта в другой.
В этом примере мы создаем два вектора строк
Семантика перемещения - это концепция, введенная в C++11, которая позволяет компилятору оптимизировать копирование объектов, когда исходный объект не будет использоваться дальше. Это достигается с помощью специальных конструкторов и операторов присваивания, называемых перемещающими конструкторами и перемещающими операторами присваивания.
Перемещение позволяет избежать ненужного копирования ресурсов, таких как динамически выделенная память или файловые дескрипторы, и улучшает производительность программы. Вместо копирования ресурсов, перемещение передает их из одного объекта в другой.
В этом примере мы создаем два вектора строк
vec1 и vec2. Затем мы используем функцию std::move для передачи содержимого vec1 в vec2 с использованием семантики перемещения. В результате, vec1 становится пустым, а vec2 получает данные, которые раньше были в vec1.