Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5🔥2
  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
  👍12❤3
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍6🔥2👀2
  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
  👍7❤1
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5🔥3
  scoped_lock происходит захват всех переданных мьютексов, а при выходе из области видимости — их автоматическое освобождение.
std::mutex mtx1, mtx2;
{
std::scoped_lock lock(mtx1, mtx2); // Захватывает оба мьютекса
// Критическая секция
} // Мьютексы автоматически освобождаются
Использование
scoped_lock особенно полезно в ситуациях, где требуется захватить несколько мьютексов одновременно, обеспечивая безопасность и удобство.Ставь
Больше ответов на сайте
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍7❤1
  
int x = 10;
decltype(x) y = 20; // Тип y будет int, так как тип x — int
decltype также учитывает категорию значения (lvalue, rvalue), что делает его полезным для точного определения типов в сложных сценариях. Например, при работе с возвращаемыми значениями функций или выражениями.Ставь
Больше ответов на сайте
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍11🔥2
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5❤1
  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
  👍5❤1
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5❤1
  Деструктор имеет имя, совпадающее с именем класса, но с тильдой (~) в начале. У него нет возвращаемого типа и параметров. Пример:
class MyClass {
public:
~MyClass() {
// Освобождение ресурсов
}
};
Деструктор вызывается в следующих случаях:
1. При выходе объекта из области видимости.
2. При явном вызове
delete для объекта, созданного через new.3. При завершении программы, если объект был создан в глобальной области видимости.
Деструкторы особенно важны для классов, управляющих ресурсами, чтобы избежать утечек памяти и других проблем.
Ставь
Больше ответов на сайте
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍7❤1
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8❤1
  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
  👍6❤1
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤5👍5
  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
  👍5❤1👀1
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍3❤1
  std::async и std::thread заключается в уровне абстракции и управлении выполнением задач.  std::thread создает отдельный поток, который требует явного управления (например, вызов join() или `detach()`). Поток начинает выполнение сразу после создания.  
std::thread t([](){ /* код для выполнения */ });
t.join(); // Ожидание завершения потока
std::async абстрагирует создание потока и возвращает std::future, который может быть использован для получения результата асинхронной операции. По умолчанию, задача может быть выполнена в отдельном потоке или отложена, в зависимости от политики запуска.  
auto future = std::async([](){ return 42; });
int result = future.get(); // Получение результата
std::async удобен для задач с возвращаемым значением, а std::thread — для полного контроля над потоками.Ставь
Больше ответов на сайте
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8❤1
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5❤2
  sort в STL (Standard Template Library) сортирует элементы в диапазоне, заданном итераторами. По умолчанию используется оператор <, но можно передать пользовательский компаратор для определения порядка сортировки.
#include <algorithm>
#include <vector>
std::vector<int> vec = {4, 2, 5, 1, 3};
std::sort(vec.begin(), vec.end()); // Сортировка по возрастанию
Для сортировки по убыванию можно использовать
std::greater:
std::sort(vec.begin(), vec.end(), std::greater<int>());
Функция
sort работает за время O(N log N) и использует гибридный алгоритм (обычно Introsort), сочетающий QuickSort, HeapSort и InsertionSort. Это делает её эффективной для большинства случаев.Ставь
Больше ответов на сайте
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍6❤2
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5🔥1