Please open Telegram to view this post
VIEW IN TELEGRAM
#include <iostream>
inline int add(int a, int b) {
// Простая inline функция для сложения двух чисел
return a + b;
}
int main() {
int result = add(3, 4);
std::cout << "Result: " << result << std::endl;
}
Inline функции полезны для небольших, часто вызываемых функций.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Массив — это статический контейнер с фиксированным размером, который задаётся при создании. Размер массива не может изменяться в процессе выполнения программы.
int arr[5] = {1, 2, 3, 4, 5}; // Статический массив из 5 элементов
Вектор — это динамический массив, который может изменять свой размер в процессе выполнения. Вектор автоматически управляет памятью, увеличивая или уменьшая её при добавлении или удалении элементов.
#include <vector>
std::vector<int> vec; // Инициализация вектора
vec.push_back(1); // Добавление элемента
vec.push_back(2); // Вектор автоматически увеличивает размер
Векторы предлагают больше функционала, таких как автоматическое управление памятью и встроенные методы для работы с элементами, в то время как массивы обеспечивают более низкий уровень доступа к памяти и подходят для случаев, когда размер известен заранее.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
пы
int и fl
oat используются для хранения числовых данных, но имеют ключевые различия.- int: Целочисленный тип, который хранит целые числа без дробной части. Занимает фиксированный объем памяти (обычно 4 байта) и имеет ограниченный диапазон значений (например, от -2³¹ до 2³¹-1).
- float: Тип с плавающей точкой, который хранит числа с дробной частью. Использует 4 байта памяти и представляет числа в формате IEEE 754. Позволяет работать с дробными значениями, но имеет ограниченную точность из-за особенностей представления.
int a = 5; // Целое число
float b = 5.5f; // Число с плавающей точкой
Основное различие:
int
подходит для точных целочисленных операций, а float
— для вычислений с дробными числами, но с возможной потерей точности.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
std::thread::hardware_concurrency — это статическая функция, которая возвращает количество потоков, которые могут быть выполнены одновременно на текущем оборудовании. Это значение обычно соответствует количеству логических процессоров (ядер) в системе.
Функция полезна для оптимизации многопоточных программ, так как позволяет определить оптимальное количество потоков для выполнения задач. Если функция не может определить количество ядер, она возвращает 0.
Использование
Ставь👍 , если было полезно!
Больше ответов на сайте👈
✈️ С++ собеседования
Функция полезна для оптимизации многопоточных программ, так как позволяет определить оптимальное количество потоков для выполнения задач. Если функция не может определить количество ядер, она возвращает 0.
#include <iostream>
#include <thread>
int main() {
unsigned int numThreads = std::thread::hardware_concurrency();
std::cout << "Number of concurrent threads supported: " << numThreads << std::endl;
return 0;
}
Использование
hardware_concurrency
помогает избежать создания избыточного количества потоков, что может привести к снижению производительности из-за накладных расходов на переключение контекста.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
std::array
— это контейнер из стандартной библиотеки, представляющий статический массив фиксированного размера. В отличие от обычных массивов, std::array
предоставляет дополнительные методы, такие как size()
, begin()
, end()
, и поддерживает итераторы, что делает его более удобным и безопасным в использовании.Пример:
#include <array>
#include <iostream>
int main() {
std::array<int, 3> arr = {1, 2, 3}; // Создание массива из 3 элементов
std::cout << "Size: " << arr.size() << std::endl; // Размер массива
}
std::array
хранит данные на стеке, что обеспечивает высокую производительность, и гарантирует отсутствие утечек памяти.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
scoped_lock
происходит захват всех переданных мьютексов, а при выходе из области видимости — их автоматическое освобождение.
std::mutex mtx1, mtx2;
{
std::scoped_lock lock(mtx1, mtx2); // Захватывает оба мьютекса
// Критическая секция
} // Мьютексы автоматически освобождаются
Использование
scoped_lock
особенно полезно в ситуациях, где требуется захватить несколько мьютексов одновременно, обеспечивая безопасность и удобство.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
int x = 10;
decltype(x) y = 20; // Тип y будет int, так как тип x — int
decltype
также учитывает категорию значения (lvalue, rvalue), что делает его полезным для точного определения типов в сложных сценариях. Например, при работе с возвращаемыми значениями функций или выражениями.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Единообразие интерфейса: Использование стандартных HTTP-методов (GET, POST, PUT, DELETE) для выполнения операций.
2. Отсутствие состояния: Каждый запрос содержит всю информацию, необходимую для его обработки.
3. Кэширование: Ответы могут быть кэшируемыми для повышения производительности.
4. Клиент-серверная архитектура: Четкое разделение между клиентом и сервером.
5. Слоистая система: Возможность использования промежуточных слоев (прокси, шлюзы) без изменения интерфейса.
// Пример HTTP-запроса GET для получения данных
GET /api/resource/123 HTTP/1.1
Host: example.com
RESTful API широко используется благодаря своей простоте, масштабируемости и удобству интеграции.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Деструктор имеет имя, совпадающее с именем класса, но с тильдой (~) в начале. У него нет возвращаемого типа и параметров. Пример:
class MyClass {
public:
~MyClass() {
// Освобождение ресурсов
}
};
Деструктор вызывается в следующих случаях:
1. При выходе объекта из области видимости.
2. При явном вызове
delete
для объекта, созданного через new
.3. При завершении программы, если объект был создан в глобальной области видимости.
Деструкторы особенно важны для классов, управляющих ресурсами, чтобы избежать утечек памяти и других проблем.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
std::lock_guard
. Он позволяет захватывать и освобождать мьютекс вручную, поддерживает отложенную блокировку, а также может быть перемещён или передан в другие функции.#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void task() {
std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // Отложенная блокировка
lock.lock(); // Захват мьютекса
std::cout << "Critical section\n";
lock.unlock(); // Освобождение мьютекса
}
std::unique_lock
полезен в сценариях, где требуется более тонкий контроль над блокировками, например, при использовании условных переменных.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
nullptr
— это ключевое слово, представляющее нулевой указатель. Оно было введено в C++11 для замены макроса NULL
и литерала 0
, которые использовались ранее.
int* ptr = nullptr;
nullptr
имеет тип std::nullptr_t
, что позволяет избежать неоднозначностей при перегрузке функций.
void func(int);
void func(int*);
func(nullptr); // Вызовется void func(int*)
Использование
nullptr
повышает безопасность и читаемость кода, так как явно указывает на нулевой указатель.Ставь
Больше ответов на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM