|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|
О корректном завершении программ на с++01.11.2025, 19:49. Показов 6532. Ответов 77
Метки нет (Все метки)
Доброго времени суток,
Изучая книгу Страуструппа "Язык программирования С++. Специальное издание", обратил внимание на следующее утверждение "При вызове exit() не будут вызваны деструкторы локальных переменных во всех функциях вверх по цепочке имевших место функциональных вызовов. Генерация и перехват исключений гарантируют корректное уничтожение локальных объектов. Вызов же exit() не позволяет корректно отработать всем функциям из цепочки вызовов. Поэтому лучше не ломать контекст вызова функций и просто сгенерировать исключение, а вопрос о том, что делать дальше, оставить обработчикам" Допустим, в моей программе в месте, далеком по цепочке вызовов от main(), возникло событие, означающее что программа штатно закончило свою работу. Означает ли написанное выше что: 1) не стоит использовать библиотечные фукнции std::exit(), std::abort() 2) можно не заморачиваться с "правильным" завершением всех функций из цепочки вызовов, а достаточно сгенерировать исключение throw finish(), например. Разместить обработчик в main() и предусмотреть в нем вызов деструкторов глобальных объектов? Хотелось бы понять и запомнить как правильно поступать при необходимости завершения сложных программ, от которых зависят в т.ч. другие процессы. Понятно, что простые учебные программы можно завершать как угодно.
0
|
|
| 01.11.2025, 19:49 | |
|
Ответы с готовыми решениями:
77
Корректное закрытие программы при завершении работы Windows Корректное завершение работы сокетов Корректное завершение потока |
|
Неэпический
|
|
| 02.11.2025, 11:28 | |
|
1
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
||
| 02.11.2025, 11:31 | ||
![]() Но если покрыто тестами - то ок
0
|
||
|
6178 / 2873 / 1042
Регистрация: 01.06.2021
Сообщений: 10,522
|
||||
| 02.11.2025, 13:35 | ||||
goto является самым эффективным - прямой переход с нулевыми накладными расходами, всего одна инструкция jmp. Для критичного к производительности кода именно goto нужно использовать. Использование флаговой переменной, возврат из функции, использование исключений, лямда с ранним возвратом и все прочие методы уступают в эффективности, хотя, не спорю, что некоторые из них по читаемости лучше.В С++ действительно есть вещи, от которых можно полностью отказаться, поскольку в языке есть более лучшая альтернатива. Но goto к ним не относится.ADnD, как и предполагал, использование goto в твоем коде не оправдано. Нужно переписать функцию. Тут можно обойтись без goto и код станет более читаемым.Кроме того, у тебя нарушена философия С++, а именно принцип единой ответственности, ибо у тебя одна функция делает абсолютно разные вещи. Лучшее решение - разделить на отдельные функции.
1
|
||||
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|||
| 02.11.2025, 13:45 | |||
0
|
|||
|
6178 / 2873 / 1042
Регистрация: 01.06.2021
Сообщений: 10,522
|
||
| 02.11.2025, 14:07 | ||
|
Или можно просто открыть cppreference и пробежаться по алфавитному списку, вот увидишь, что ты много чего не используешь... И речь даже не про самый свежачок из С++23 / С++26, но много вещей найдешь из С++11 - С++20, которые ты вообще не использовал.
0
|
||
| 02.11.2025, 14:17 | ||
|
0
|
||
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 02.11.2025, 14:18 | |
|
нет, нейросеть меня не интересует.
Про новые стандарты то понятно, кое-то я оттуда посматриваю, но реально не использовал ещё. Тут же речь про то, что давно есть в языке
0
|
|
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||||||||
| 02.11.2025, 14:38 [ТС] | ||||||||
0
|
||||||||
|
6178 / 2873 / 1042
Регистрация: 01.06.2021
Сообщений: 10,522
|
|||||||
| 02.11.2025, 14:49 | |||||||
1
|
|||||||
| 02.11.2025, 16:53 | ||
|
Тут скользкий момент. С готовыми инструментами для char * в языке совсем не густо, лучше для std::string, хотя по-моему и там бедненько. Многие предпочитают не тратить времени на "допотопный" char *, это имеет свои плюсы/минусы. Лично мне не кажется что написать пяток-десяток хороших ф-ций - такая уж потеря времени, пользы больше.
2
|
||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||||||||||||||
| 02.11.2025, 19:48 [ТС] | ||||||||||||||
|
Igor3D, Вы затронули очень интересные для меня вопросы:
<cctype> такие как std::isspace(), std::isalpha(), std::isalnum() ведут к вылетам когда встречаются кириллические символы. Работаю в кодировке 1251. При обработке стандартных ASCII-символов проблем нет, но как только встречается кириллица, неважно как: при консольном вводе, при чтении файла, я получаю результат:Я не стал разбираться проблема ли это конкретно моей системы: раз ошибка появилась у меня, значит может появиться и у другого пользователя, значит этими инструментами этой библиотеки я пользоваться не буду. 1) с динамическими массивами char[] с обращением через char* и char** 2) со строками string Сравнил производительность через std::chrono::high_resolution_clock и ужаснулся: одну и ту же папку char-версия обрабатывает за 21 мс, а std::string-версия за 77 мс. Хотя по комментариям из интернета они должны быть +/- равнозначны. Может я использую не те алгоритмы, но я пока только учусь. Сейчас char* мне кажется предпочтительным. При такой разнице в производительности, можно приучить себя к дисциплине и контролировать удаление объектов, которые я создавал при помощью операции new. Изучал использование памяти обоих версий при помощи профилирования кучи Visual Studio, итоговый расход памяти в килобайтах на неразрешенные выделения в версии std::string (где нет ни одного new) даже выше чем в версии с char* и new + delete[] Может ли использование функций WIN32 API привести к такому падению производительности при использовании std::string??? Например, этих: Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
0
|
||||||||||||||
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
||
| 02.11.2025, 19:51 | ||
|
1) измерение производится в дебажной версии 2) что-то делается неэффективно 3) ещё что-нибудь Но лучше сразу перейти на std::string_view, он прям создан для написания парсеров
1
|
||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|
| 02.11.2025, 19:51 | |
|
2
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 02.11.2025, 19:53 | |
|
ADnD, std::string короткие строки (0...15) хранит на стеке, а дальше идёт в динамическую память
0
|
|
| 02.11.2025, 23:45 | ||||
|
0
|
||||
|
6178 / 2873 / 1042
Регистрация: 01.06.2021
Сообщений: 10,522
|
||
| 02.11.2025, 23:52 | ||
+100500
0
|
||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|||||||||||||||||||
| 03.11.2025, 19:10 [ТС] | |||||||||||||||||||
![]() Кликните здесь для просмотра всего текста
В начале я бы разделил свою функцию void lexical_analizer::getInfoFromHeader(HeaderInfo* headerInfo, char* headerFile) на 3:Кликните здесь для просмотра всего текста
Далее постараюсь логически четче и проще структурировать код. Напишу что получится! также определю функцию Вот что получилось. И правильно работает. Кликните здесь для просмотра всего текста
!!!!!! При этом, моя изначальная версия работает быстрее!!!! Файл обрабатывался за 24 мс, стал за 34 мс !!!!! Накладные расходы на вызов функций???
0
|
|||||||||||||||||||
| 03.11.2025, 20:50 | ||||||||||
, сравнение разных подходов интересно и полезно.
- while с инкрементом в конце цикла здесь явно не удачен, на каждый чих нужно проверять финальный null. Лучше цикл for (счетчик найдем через strlen) - а нужны ли тут вообще какие-то циклы и пробеги по строке? Не обойтись ли типовыми ф-циями поиска подстроки (типа strstr), пусть они и бегают - ну и главное
1
|
||||||||||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|||||||||||
| 03.11.2025, 21:15 [ТС] | |||||||||||
|
Igor3D, большое спасибо за помощь, вы действительно подсказываете и помогаете развиваться!
![]() Фрагмент кода просматривает текст исходника с++, считает количество строк с комментариями, строк без комментариев и общее количество слов в тексте. Просто учебная программа ![]() Я замерил производительность последней версии программы, с разделением void lexical_analizer::getInfoFromHeader(HeaderInfo* headerInfo, char* headerFile) на 5 функций и использованием std::isspace(char). Неприятно удивлен падением производительности. Время обработки файла увеличилось с 24 до 34 мс.Причина в замене этого:
0
|
|||||||||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|
| 03.11.2025, 21:25 | |
|
ADnD, надеюсь вы эти замеры не в отладочной версии делаете?
0
|
|
| 03.11.2025, 21:25 | |
|
Помогаю со студенческими работами здесь
40
Корректное завершение работы консольного приложения Корректное освобождение памяти при принудительном завершении потока TThread Потоки и их корректное завершение Корректное завершение
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|