#вопросы_с_собеседований
Как работает оператор new в C++ и почему используется именно этот оператор для выделения динамической памяти?
Оператор new используется в C++ для выделения динамической памяти (heap memory), которая выделяется во время выполнения программы. При его вызове, сначала выделяется необходимое количество памяти из операционной системы, а затем возвращается указатель на эту область памяти.
При исполнении оператора new происходит следующее:
1. Сначала он выделяет память в размере, указанном в аргументе оператора или размере типа данных, на который указывает указатель.
2. Затем он вызывает конструктор для создания объекта в выделенной области памяти.
3. Возвращает указатель на выделенную память.
Оператор new является предпочтительным для выделения памяти по сравнению с функцией malloc в C, поскольку он позволяет при выделении памяти автоматически вызывать конструкторы объектов. С использованием оператора new не нужно явно выделять память под объекты и вызывать конструкторы отдельно.
В данном примере оператор new выделяет память под объект класса MyClass и вызывает его конструктор. Оператор delete используется для освобождения ранее выделенной памяти.
Как работает оператор new в C++ и почему используется именно этот оператор для выделения динамической памяти?
Оператор new используется в C++ для выделения динамической памяти (heap memory), которая выделяется во время выполнения программы. При его вызове, сначала выделяется необходимое количество памяти из операционной системы, а затем возвращается указатель на эту область памяти.
При исполнении оператора new происходит следующее:
1. Сначала он выделяет память в размере, указанном в аргументе оператора или размере типа данных, на который указывает указатель.
2. Затем он вызывает конструктор для создания объекта в выделенной области памяти.
3. Возвращает указатель на выделенную память.
Оператор new является предпочтительным для выделения памяти по сравнению с функцией malloc в C, поскольку он позволяет при выделении памяти автоматически вызывать конструкторы объектов. С использованием оператора new не нужно явно выделять память под объекты и вызывать конструкторы отдельно.
В данном примере оператор new выделяет память под объект класса MyClass и вызывает его конструктор. Оператор delete используется для освобождения ранее выделенной памяти.
memmove
Функция
Функция
Функция
memmove
используется для копирования блока памяти из одного места в другое. Она объявлена в заголовочном файле <cstring>
. Она принимает аргументы типа void *
и const void *
, что позволяет ей работать с любыми типами данных. Она просто копирует указанное количество байтов из исходного буфера в целевой.memmove
может обрабатывать перекрывающиеся буферы. В отличие от memcpy
, которая просто копирует данные из одного места в другое, memmove
может безопасно перемещать данные, даже если исходный и целевой буферы перекрываются.Функция
memmove
может быть полезна для удаления элементов из массива. Например, если вы хотите удалить элемент из массива и сдвинуть оставшиеся элементы влево, вы можете использовать memmove
для перемещения данных в массиве.Константные методы
В C++, ключевое слово
Когда вы вызываете константный метод для объекта класса, компилятор гарантирует, что внутри этого метода вы не будете изменять члены данных объекта, кроме членов, объявленных как
В C++, ключевое слово
const
имеет различное значение в зависимости от контекста. Оно может быть применено к методам классов для указания, что метод не будет изменять состояние объекта, на котором он вызывается. Такие методы называются «константными методами». Когда вы вызываете константный метод для объекта класса, компилятор гарантирует, что внутри этого метода вы не будете изменять члены данных объекта, кроме членов, объявленных как
mutable
(они могут изменяться внутри константных методов).Что такое memory leak?
Утечка памяти может привести к постепенному увеличению объема занятой оперативной памяти программой. Если утечка продолжает развиваться, это может привести к уменьшению производительности программы и даже к завершению программы из-за нехватки доступной памяти.
Memory leak
(утечка памяти) — это ситуация, при которой программа использует динамическую память, но забывает освободить эту память перед завершением работы или перед повторным использованием. Как результат, выделенная память остается занята в оперативной памяти, несмотря на то, что она уже не используется, и таким образом происходит утечка памяти.Утечка памяти может привести к постепенному увеличению объема занятой оперативной памяти программой. Если утечка продолжает развиваться, это может привести к уменьшению производительности программы и даже к завершению программы из-за нехватки доступной памяти.
Перегрузка функций
Перегрузка функций — это возможность определения нескольких функций с одним и тем же именем, но разными параметрами. Когда вызывается такая функция, компилятор определяет, какая из перегруженных функций должна быть вызвана, основываясь на типах аргументов, переданных при вызове.
Таким образом можно создать несколько вариантов функции, которые выполняют аналогичные действия, но принимают разные типы аргументов. Это позволяет создавать более удобный и интуитивно понятный интерфейс для программистов, так как они могут вызывать одно и то же имя функции с разными типами данных, не заботясь о различиях в именах функций.
Перегрузка функций — это возможность определения нескольких функций с одним и тем же именем, но разными параметрами. Когда вызывается такая функция, компилятор определяет, какая из перегруженных функций должна быть вызвана, основываясь на типах аргументов, переданных при вызове.
Таким образом можно создать несколько вариантов функции, которые выполняют аналогичные действия, но принимают разные типы аргументов. Это позволяет создавать более удобный и интуитивно понятный интерфейс для программистов, так как они могут вызывать одно и то же имя функции с разными типами данных, не заботясь о различиях в именах функций.
Виртуальные функции
Виртуальные функции — это механизм, позволяющий создавать функции в базовом классе, которые могут быть переопределены в производных классах. Основная идея заключается в том, что виртуальные функции могут вызывать методы из объектов производных классов через указатели или ссылки на базовый класс, и при этом будет вызвана та версия функции, которая соответствует реальному типу объекта.
Чтобы объявить функцию виртуальной, необходимо использовать ключевое слово
Виртуальные функции — это механизм, позволяющий создавать функции в базовом классе, которые могут быть переопределены в производных классах. Основная идея заключается в том, что виртуальные функции могут вызывать методы из объектов производных классов через указатели или ссылки на базовый класс, и при этом будет вызвана та версия функции, которая соответствует реальному типу объекта.
Чтобы объявить функцию виртуальной, необходимо использовать ключевое слово
virtual
в определении функции в базовом классе. Производные классы могут переопределять виртуальные функции с помощью того же ключевого слова virtual
. Таким образом, при вызове виртуальной функции через указатель или ссылку на базовый класс будет вызвана версия функции из реального типа объекта.Абстрактная фабрика
Абстрактная фабрика (Abstract Factory) — это паттерн проектирования, который позволяет создавать семейства связанных объектов без указания их конкретных классов. Этот паттерн позволяет создавать объекты, которые взаимодействуют друг с другом и предназначены для работы вместе, но без явной зависимости от конкретных классов.
Абстрактная фабрика (Abstract Factory) — это паттерн проектирования, который позволяет создавать семейства связанных объектов без указания их конкретных классов. Этот паттерн позволяет создавать объекты, которые взаимодействуют друг с другом и предназначены для работы вместе, но без явной зависимости от конкретных классов.
Как работает std::unique_ptr?
Принцип работы
std::unique_ptr
— это умный указатель (smart pointer), предназначенный для управления динамически выделенными объектами. Он обеспечивает автоматическое освобождение памяти при выходе объекта из области видимости или при необходимости.Принцип работы
std::unique_ptr
заключается в том, что он владеет указателем на выделенную память и следит за временем жизни этой памяти. Когда объект std::unique_ptr
выходит из области видимости, он автоматически освобождает память, на которую он указывает, путем вызова оператора delete
для хранящегося указателя.Семантика перемещения
Семантика перемещения позволяет эффективно перемещать ресурсы между объектами без копирования данных. Это понятие стало особенно актуальным в свете улучшений, внесенных в язык C++11 и последующих стандартах.
Семантика перемещения решает проблемы, связанные с копированием больших данных или ресурсов, что может быть очень затратным по времени и памяти. Вместо копирования данные «перемещаются» из одного объекта в другой, при этом исходный объект теряет право владения этими данными. Это осуществляется с использованием специальных методов и операторов, таких как конструктор перемещения (
Семантика перемещения позволяет эффективно перемещать ресурсы между объектами без копирования данных. Это понятие стало особенно актуальным в свете улучшений, внесенных в язык C++11 и последующих стандартах.
Семантика перемещения решает проблемы, связанные с копированием больших данных или ресурсов, что может быть очень затратным по времени и памяти. Вместо копирования данные «перемещаются» из одного объекта в другой, при этом исходный объект теряет право владения этими данными. Это осуществляется с использованием специальных методов и операторов, таких как конструктор перемещения (
move constructor
) и оператор перемещения (move assignment operator
).Memento
Memento — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать внутреннее состояние объекта без нарушения инкапсуляции. Он полезен, например, когда вам нужно реализовать функциональность отмены/возврата действий или сохранения состояния объекта для последующего восстановления.
#для_продвинутых
Memento — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать внутреннее состояние объекта без нарушения инкапсуляции. Он полезен, например, когда вам нужно реализовать функциональность отмены/возврата действий или сохранения состояния объекта для последующего восстановления.
#для_продвинутых
Лямбда-функция
Лямбда-функция (или просто лямбда) — это анонимная функция в C++, которая может быть определена непосредственно внутри кода. Лямбда-функции предоставляют более компактный и удобный способ создания небольших функций на лету, без необходимости объявления их отдельно.
Лямбда-функции также часто используются вместе с алгоритмами стандартной библиотеки C++, такими как
#для_начинающих
Лямбда-функция (или просто лямбда) — это анонимная функция в C++, которая может быть определена непосредственно внутри кода. Лямбда-функции предоставляют более компактный и удобный способ создания небольших функций на лету, без необходимости объявления их отдельно.
Лямбда-функции также часто используются вместе с алгоритмами стандартной библиотеки C++, такими как
std::for_each
, std::transform
, std::sort
(как на примере выше), и другими, чтобы создавать более компактный и выразительный код.#для_начинающих
std::atomic_flag
Метод
Метод
В этом примере создаются два потока
std::atomic_flag
является классом для реализации простой атомарной флаговой переменной. Он предоставляет механизм безопасной работы с флагом в многопоточной среде без необходимости использования блокировок.std::atomic_flag
имеет два основных метода: test_and_set()
и clear()
:Метод
test_and_set()
устанавливает флаг в "истину" и возвращает предыдущее значение флага. Если флаг уже был установлен, вызов test_and_set()
вернет true
, в противном случае он вернет false
.Метод
clear()
сбрасывает флаг в "ложь".В этом примере создаются два потока
workerThread1
и workerThread2
, которые пытаются получить доступ к защищенному блоку кода. Флаг flag
инициализируется значением true
с помощью ATOMIC_FLAG_INIT
. В цикле worker()
каждый поток пытается вызвать test_and_set()
для захвата флага. Если флаг уже установлен, поток ждет и повторно пытается его захватить. Когда флаг наконец захватывается, поток выполняет некоторую работу и вызывает clear()
для освобождения флага.std::async
В C++
Функция
В этом примере функция
Функция
В C++
std::async
- это шаблон функции, предоставляемый стандартной библиотекой <future>
. Он используется для асинхронного выполнения функции или вызываемого объекта и получения объекта future, представляющего результат вычислений.Функция
std::async
создает новый поток или использует существующий поток из пула потоков реализации для выполнения поставленной задачи. Она возвращает объект std::future
, который можно использовать для получения результата или статуса вычисления.В этом примере функция
AddNumbers
выполняется асинхронно с использованием std::async
. Она принимает два целых числа в качестве аргументов и возвращает их сумму. Функция std::async
вызывается с помощью AddNumbers
и аргументов 5 и 10.Функция
std::async
возвращает объект std::future<int>
, который представляет собой результат вычисления. Вызывая функцию get()
на объекте future
, мы блокируем выполнение до завершения вычислений и получаем результат.#вопросы_с_собеседований
Какой код выполняется до функции main?
Ответ:
Конструкторы глобальных объектов.
Какой код выполняется до функции main?
Ответ: