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
Когда std::string_view помогает, а когда создает висячие ссылки!
Ниже пример безопасного использования в параметре функции чтения.
Проблемы начинаются, когда view живет дольше строки, на которую он смотрит. Тогда ошибка может проявляться нестабильно, и ее тяжело поймать без хороших проверок.
Есть и более тихий вариант той же проблемы, когда появляется временный объект после
В таких местах код выглядит невинно, поэтому ошибка часто проходит ревью. Если время жизни источника неочевидно, безопаснее хранить и возвращать
📣 C++ Ready | #практика
std::string_view полезен там, где нужна легкая ссылка на строку без копирования. Это делает интерфейсы аккуратнее и часто снижает лишние аллокации.Ниже пример безопасного использования в параметре функции чтения.
void log_message(std::string_view text) {
}Проблемы начинаются, когда view живет дольше строки, на которую он смотрит. Тогда ошибка может проявляться нестабильно, и ее тяжело поймать без хороших проверок.
std::string_view bad() {
return std::string("tmp");
}Есть и более тихий вариант той же проблемы, когда появляется временный объект после
substr.std::string s = "hello";
std::string_view v = s.substr(0, 3);
В таких местах код выглядит невинно, поэтому ошибка часто проходит ревью. Если время жизни источника неочевидно, безопаснее хранить и возвращать
std::string.std::string_view остается отличным инструментом, но только когда вы явно контролируете время жизни данных.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤5👍4
В этой статье:
• Что такое fibers и чем они отличаются от потоков • Сохранение и восстановление контекста на ассемблере • Интеграция волокон в C++-код с рабочими примерами🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤4👍4
Structured bindings — не только для std::pair / std::tuple!
Многие знают structured bindings как способ “распаковать”
Было:
Стало:
Плюсы:
• меньше шума в коде, особенно когда полей 2–3
• удобно в циклах и при распаковке результата функций
• имена задаёшь сразу на месте — читается быстрее
Нюанс: это копия значений. Если нужен доступ к оригинальным полям (чтобы менять их), бери ссылки:
🔥 Итог: если работаешь с простыми
📣 C++ Ready | #совет
Многие знают structured bindings как способ “распаковать”
std::pair или std::tuple, но с C++17 это работает и для обычных struct — если поля публичные.Было:
Point p{10, 20};
int x = p.x;
int y = p.y;Стало:
auto [x, y] = p;
Плюсы:
• меньше шума в коде, особенно когда полей 2–3
• удобно в циклах и при распаковке результата функций
• имена задаёшь сразу на месте — читается быстрее
Нюанс: это копия значений. Если нужен доступ к оригинальным полям (чтобы менять их), бери ссылки:
auto& [x, y] = p;
x = 42; // изменит p.x
struct (Point, Size, Range) — распаковывай их через structured bindings. Код становится короче и понятнее без .x/.y на каждой строке.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤5🤝4
На картинке — компактная визуальная памятка по стандартным алгоритмам C++, показывающая, какие операции можно выполнять с диапазонами: поиск и проверки без изменения данных, переупорядочивание элементов, изменение значений, работу с отсортированными последовательностями и числовые алгоритмы.
Сохрани, чтобы быстрее ориентироваться в STL и реже лезть в документацию при написании C++-кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍5🔥5
Небольшая консольная утилита проходит по директории и суммирует размеры всех обычных файлов, чтобы получить общий “вес” папки в байтах.
В этой задаче узнаешь:
• Как обойти директорию рекурсивно через recursive_directory_iterator;
• Как отличать файлы от папок и “прочих” объектов (is_regular_file) и брать размер (file_size);
• Почему обход может бросать исключения и как аккуратно обработать ошибки доступа.
Мини-утилита получается кроссплатформенной и легко расширяется.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤5👍5