Когда список вариантов известен заранее,
std::variant часто дает более прозрачный код, потому что все случаи перечислены явно и проверяются на этапе компиляции.В этом гайде:
• Сравним подход через virtual и подход через std::variant, чтобы увидеть разницу в модели;
• Разберем std::visit на простом примере вычисления площади;
• Покажем, как добавление нового типа сразу подсвечивает необработанные места.
Освоив эту технику, вы сможете выбирать между runtime и compile-time полиморфизмом осознанно и без лишней сложности.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍9❤7
Почему assert исчезает в release и как не потерять проверки!
Такой код полезен в
Но в
Рабочий подход такой: через
🔥 Если коротко,
📣 C++ Ready | #практика
assert работает только пока у вас не задан NDEBUG. Когда вы собираете release с -DNDEBUG, проверки из assert вырезаются, поэтому поведение меняется:#include <cassert>
void process(int index, int size) {
assert(index >= 0 && index < size);
// ...
}
Такой код полезен в
debug, потому что он сразу показывает нарушение контракта. Но в
release этот assert может не выполниться ни разу, и поэтому критичные проверки нельзя оставлять только в нем:# обычно для release
-DNDEBUG
Рабочий подход такой: через
assert проверяйте внутренние инварианты, а пользовательские и внешние данные валидируйте обычным if, который останется в любом режиме сборки:if (index < 0 || index >= size) {
throw std::out_of_range("index");
}
assert(index >= 0 && index < size);assert нужен для отладки, а надежность release-версии должна держаться на явной валидации входа.Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥8❤4
This media is not supported in your browser
VIEW IN TELEGRAM
Этот сайт помогает анализировать структуры данных: деревья, графы, обходы и множество другого. Здесь нет решений задач или подготовкой к собеседованиям, упор именно на понимание того, как и почему всё устроено. Материал подается последовательно и концептуально, поэтому хорошо подходит даже новичкам.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤22👍9🔥8
Почему return std::move(local) иногда делает код медленнее?
На вид это выглядит как явная оптимизация. Кажется, что ты прямо говоришь компилятору: «перемещай».
Но в
Когда ты пишешь
Поэтому в таком месте явный
🔥 Если возвращаешь локальный объект, в большинстве случаев пиши просто
📣 C++ Ready | #совет
На вид это выглядит как явная оптимизация. Кажется, что ты прямо говоришь компилятору: «перемещай».
Но в
return у локальной переменной работает важная оптимизация. При return s; компилятор часто строит итоговый объект сразу на месте. Лишнего перемещения в этом случае вообще нет.Когда ты пишешь
return std::move(s);, этот путь часто отключается. Тогда появляется отдельный move, а это уже лишняя операция.Поэтому в таком месте явный
std::move часто не помогает, а мешает.std::string make_name() {
std::string s = "neo";
return s;
}return s;.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤11👍5
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25❤7👍5🤝3👎1
Почему std::vector копирует при росте, хотя move-конструктор есть?
Когда
Из-за этого в горячем месте можно получить неожиданную просадку. В коде вроде все современно, но на больших объемах срабатывает не тот сценарий, который ты ждешь.
Если перенос у типа реально безопасен, его стоит явно пометить как
Есть важный нюанс. Если копирование недоступно, контейнеру иногда просто не из чего выбирать, и он будет переносить даже без
🔥 Если тип хранится в
📣 C++ Ready | #совет
Когда
vector увеличивает емкость, он переносит элементы в новую память. В этот момент контейнер старается сохранить сильную гарантию исключений. Если move может бросить, vector выбирает более безопасный путь и копирует.Из-за этого в горячем месте можно получить неожиданную просадку. В коде вроде все современно, но на больших объемах срабатывает не тот сценарий, который ты ждешь.
Если перенос у типа реально безопасен, его стоит явно пометить как
noexcept.struct Buffer {
Buffer(Buffer&&) noexcept = default;
};Есть важный нюанс. Если копирование недоступно, контейнеру иногда просто не из чего выбирать, и он будет переносить даже без
noexcept.vector, проверяй move-конструктор. Без noexcept контейнер часто выберет copy.Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥8❤7
🔥14❤6👍6
This media is not supported in your browser
VIEW IN TELEGRAM
FlowchartAI — это бесплатный AI-генератор блок-схем, который из текста или кода автоматически строит диаграмму. Он анализирует твой ввод (описание процесса/алгоритма или код) и превращает его в визуальную блок-схему, которую можно смотреть прямо в браузере без регистрации.
📌 Оставляю ссылочку: flowchartai.org
📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍7🔥7👎1