Что за ошибка в приведенном ниже коде и как ее исправить?
Последним аргументом memset должен быть sizeof(*bar), а не sizeof(bar). sizeof(bar) вычисляет размер bar (то есть самого указателя), а не размер структуры, на которую указывает bar. Поэтому код можно исправить, используя sizeof(*bar) в качестве последнего аргумента вызова memset.
my_struct_t *bar;
/* ... делаем что-то, включая указание bar на определенный объект my_struct_t */
memset(bar, 0, sizeof(bar));
Различие локальной переменной и поля класса с одинаковым именем
Указатель this может быть полезен в случае, когда локальная переменная в методе имеет то же самое имя, что и поле объекта:
Здесь в методе set мы присваиваем полю класса x значение локальной переменной this. Чтобы различить поле класса x и локальную переменную с тем же именем мы используем запись this->x при обращении к полю класса.
Указатель this может быть полезен в случае, когда локальная переменная в методе имеет то же самое имя, что и поле объекта:
void set(int x) { this->x = x; }
Здесь в методе set мы присваиваем полю класса x значение локальной переменной this. Чтобы различить поле класса x и локальную переменную с тем же именем мы используем запись this->x при обращении к полю класса.
#вопросы_с_собеседований
Что случится, если exception выйдет за пределы потока?
Если exception выходит за пределы потока, то оно не может быть обработано на текущем уровне, т. к. он уже завершен. В таком случае исключение будет зарегистрировано как неперехваченное и может привести к аварийному завершению программы.
Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан.
Что случится, если exception выйдет за пределы потока?
Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан.
execution policy для параллельных алгоритмов
Execution policy в C++ - это новшество, введенное в стандарте языка C++17. Это механизм, который позволяет выбрать, как именно должны выполняться алгоритмы в стандартной библиотеке: последовательно или параллельно.
Существуют три варианта execution policy:
-
-
-
Execution policy может быть использован в комбинации с многими алгоритмами в стандартной библиотеке, такими как
Execution policy в C++ - это новшество, введенное в стандарте языка C++17. Это механизм, который позволяет выбрать, как именно должны выполняться алгоритмы в стандартной библиотеке: последовательно или параллельно.
Существуют три варианта execution policy:
-
seq: выполняет алгоритм последовательно.-
par: выполняет алгоритм параллельно, используя все доступные ядра процессора.-
par_unseq: выполняет алгоритм параллельно и может использовать неупорядоченное исполнение.Execution policy может быть использован в комбинации с многими алгоритмами в стандартной библиотеке, такими как
std::for_each, std::transform, std::reduce и другими. Например, код выше выполняет алгоритм std::for_each параллельно.Проверить, найден ли элемент в массиве С++
В С++ вы должны использовать std::find и проверить, указывает ли результирующий указатель на конец диапазона.
#вопросы_с_собеседований
В С++ вы должны использовать std::find и проверить, указывает ли результирующий указатель на конец диапазона.
#вопросы_с_собеседований
• В C++ имя функции пользовательских операторов — это сам символ оператора.• Унарные и бинарные операторы (- и -) различаются по количеству аргументов.• Унарные операторы инкремента и декремента (++, --) имеют одинаковую сигнатуру.• Для различия постфиксных операторов ++ и -- используется фиктивный аргумент int.• Постфиксные операторы ++ и -- принимают фиктивный аргумент int как флаг для компилятора.Please open Telegram to view this post
VIEW IN TELEGRAM
• C++ позволяет вызывать статические методы из экземпляра таким же образом, как и из класса. • Это позволяет изменять нестатические методы экземпляра на статические без необходимости обновления записи вызова функции.Please open Telegram to view this post
VIEW IN TELEGRAM
• Перегрузка операторов , (запятая), || (логическое ИЛИ), и && (логическое И) сбивает с толку.• Оператор «запятая» обычно гарантирует, что левая сторона вычисляется до правой.• Операторы || и && обычно вычисляют правую сторону только при необходимости.• Перегруженные версии этих операторов — это вызовы функций, которые вычисляются в неопределенном порядке.• Перегрузка этих операторов может привести к некорректному использованию синтаксиса C++.Please open Telegram to view this post
VIEW IN TELEGRAM
• C++11 позволяет перегружать методы с использованием квалификатора ссылки, который находится в той же позиции, что и cv-квалификаторы (const и volatile квалификаторы).• Это влияет на то, какой метод будет вызван для объекта, в зависимости от типа this, – является ли он lvalue или же rvalue.Please open Telegram to view this post
VIEW IN TELEGRAM
C++ включает синтаксическое сокращение для одновременного объявления переменной и разветвления по её значению.
• Это выглядит как декларация переменной внутри условия оператора if или while, и одновременное присваивание ей значения.Please open Telegram to view this post
VIEW IN TELEGRAM
• Размещающий new - это альтернативный синтаксис для оператора new, который размещает объект в уже выделенной памяти. Он используется для настройки vtable и вызова конструктора.• Размещающий new полезен для написания кастомных аллокаторов, оптимизирующих производительность. Он позволяет выделить большой блок памяти и последовательно размещать объекты без пробелов, что уменьшает фрагментацию памяти и снижает накладные расходы.Please open Telegram to view this post
VIEW IN TELEGRAM
• Переопределение ключевых слов — плохая практика программирования, но это возможно через препроцессор. Это может вводить баги, например, #define true false или #define else.#define int float
#define float char
• Такой код будет работать, хотя это может быть полезно в некоторых ситуациях. Например, если мы используем большую библиотеку и не хотим публичного наследования, мы можем временно отключить защиту доступа перед подключением заголовков библиотеки, а затем снова включить её.#define public private
#include "mylibrary.h"
#undef private
• Это позволяет управлять доступом к библиотеке без её изменения, но требует осторожности.Please open Telegram to view this post
VIEW IN TELEGRAM
Lambda-функции — это мощный инструмент в C++, позволяющий определять анонимные функции прямо в месте их использования.
• Они особенно полезны для создания компактного и читаемого кода, например, при работе с алгоритмами из стандартной библиотеки (STL).Please open Telegram to view this post
VIEW IN TELEGRAM
• Типобезопасные перечисления, которые решают множество проблем с C-перечислениями, включая неявные преобразования, арифметические операции, невозможность указать базовый тип, загрязнение области видимости и т.д.Please open Telegram to view this post
VIEW IN TELEGRAM
• Использование private и public при наследовании в C++ позволяет контролировать доступ к членам базового класса в производных классах.• Это может быть полезно для сокрытия частей реализации базового класса от внешнего мира или ограничения доступа к членам в иерархии классов.• Эта фишка особенно полезна при проектировании классов и их взаимодействия, позволяя более гибко управлять доступом к данным и методам в рамках наследования.Please open Telegram to view this post
VIEW IN TELEGRAM
Итераторы-адаптеры - это классы, которые оборачивают стандартные итераторы и предоставляют дополнительные возможности или изменяют их поведение.
• Итераторы-адаптеры предоставляют дополнительные возможности для работы с итераторами, такие как итерация в обратном порядке или фильтрация элементов.• Использование итераторов-адаптеров позволяет упростить код и делает его более читаемым за счет высокоуровневого интерфейса.• Итераторы-адаптеры добавляют гибкость в работу с контейнерами, позволяя выполнять сложные операции и манипуляции с элементами.Please open Telegram to view this post
VIEW IN TELEGRAM
• Параметром шаблона могут быть конкретные целые числа.• Параметром шаблона также могут быть конкретные функции.• Это позволяет компилятору встраивать вызовы для этих функций в коде инстанцированного шаблона для более эффективного выполнения.• В примере ниже, функция memoize() в качестве шаблонного параметра получает функцию и вызывает эту функцию для новых значений аргумента.• Старое сохранённое значение аргумента берётся из кеша.Please open Telegram to view this post
VIEW IN TELEGRAM
В многопоточных приложениях иногда требуется лениво инициализировать ресурсы, гарантируя, что это произойдет только один раз, даже если несколько потоков пытаются сделать это одновременно.
std::call_once.Please open Telegram to view this post
VIEW IN TELEGRAM