|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|
О корректном завершении программ на с++01.11.2025, 19:49. Показов 6616. Ответов 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
|
|
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,099
|
||
| 02.11.2025, 11:31 | ||
![]() Но если покрыто тестами - то ок
0
|
||
|
6222 / 2923 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
|
||||
| 02.11.2025, 13:35 | ||||
goto является самым эффективным - прямой переход с нулевыми накладными расходами, всего одна инструкция jmp. Для критичного к производительности кода именно goto нужно использовать. Использование флаговой переменной, возврат из функции, использование исключений, лямда с ранним возвратом и все прочие методы уступают в эффективности, хотя, не спорю, что некоторые из них по читаемости лучше.В С++ действительно есть вещи, от которых можно полностью отказаться, поскольку в языке есть более лучшая альтернатива. Но goto к ним не относится.ADnD, как и предполагал, использование goto в твоем коде не оправдано. Нужно переписать функцию. Тут можно обойтись без goto и код станет более читаемым.Кроме того, у тебя нарушена философия С++, а именно принцип единой ответственности, ибо у тебя одна функция делает абсолютно разные вещи. Лучшее решение - разделить на отдельные функции.
1
|
||||
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,099
|
|||
| 02.11.2025, 13:45 | |||
0
|
|||
|
6222 / 2923 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
|
||
| 02.11.2025, 14:07 | ||
|
Или можно просто открыть cppreference и пробежаться по алфавитному списку, вот увидишь, что ты много чего не используешь... И речь даже не про самый свежачок из С++23 / С++26, но много вещей найдешь из С++11 - С++20, которые ты вообще не использовал.
0
|
||
| 02.11.2025, 14:17 | ||
|
0
|
||
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,099
|
|
| 02.11.2025, 14:18 | |
|
нет, нейросеть меня не интересует.
Про новые стандарты то понятно, кое-то я оттуда посматриваю, но реально не использовал ещё. Тут же речь про то, что давно есть в языке
0
|
|
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||||||||
| 02.11.2025, 14:38 [ТС] | ||||||||
0
|
||||||||
|
6222 / 2923 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
|
|||||||
| 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
|
||||||||||||||
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,099
|
||
| 02.11.2025, 19:51 | ||
|
1) измерение производится в дебажной версии 2) что-то делается неэффективно 3) ещё что-нибудь Но лучше сразу перейти на std::string_view, он прям создан для написания парсеров
1
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 02.11.2025, 19:51 | |
|
2
|
|
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,099
|
|
| 02.11.2025, 19:53 | |
|
ADnD, std::string короткие строки (0...15) хранит на стеке, а дальше идёт в динамическую память
0
|
|
| 02.11.2025, 23:45 | ||||
|
0
|
||||
|
6222 / 2923 / 1046
Регистрация: 01.06.2021
Сообщений: 10,820
|
||
| 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
|
|||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 03.11.2025, 21:25 | |
|
ADnD, надеюсь вы эти замеры не в отладочной версии делаете?
0
|
|
| 03.11.2025, 21:25 | |
|
Помогаю со студенческими работами здесь
40
Корректное завершение работы консольного приложения Корректное освобождение памяти при принудительном завершении потока TThread Потоки и их корректное завершение Корректное завершение
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|