Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Выделение памяти с использованием ключевого слова new и исключения

05.03.2017, 13:56. Показов 2051. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Где-то читал, что наличие в коде throw, даже в том случае когда нет try/catch может приводить к некоторым замедлению потому что где-то внутри генерируется специальный код что бы бросить исключение.
Верно ли данное утверждение? Если оно верно, выходит malloc может оказаться куда более эффективным чем new, просто потому что не кидает исключения?

Добавлено через 2 минуты
И как ведет себя в таких случаях placement new? Ведь он не выделяет память а просто использует переданный ему указатель. Он не бросается исключениями?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.03.2017, 13:56
Ответы с готовыми решениями:

Выделение памяти с использованием malloc
Доброго времени суток :) В общем есть следующий класс: class Addres { char name; char street; char city; char state; ...

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...

Вывести все слова текста, которые нельзя составить из «ключевого» слова
Помогите пожалуйста,в edit1 вводиться текст нужно вывести все слова текста, которые нельзя составить из «ключевого» слова. Ключевое слово...

14
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.03.2017, 20:39
Цитата Сообщение от sys_beginner Посмотреть сообщение
Верно ли данное утверждение?
Зависит от ОС, компилятора, платформы и прочих условий.

Цитата Сообщение от sys_beginner Посмотреть сообщение
выходит malloc может оказаться куда более эффективным чем new, просто потому что не кидает исключения?
Как можно сравнивать функции, которые выполняют совершенно разные действия и
предназначены для разных вещей? Тоже самое, что сравнивать скорость include в C и
std::vector.push_back в C++...
3
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
05.03.2017, 20:46  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Как можно сравнивать функции, которые выполняют совершенно разные действия и
предназначены для разных вещей?
Имелось ввиду в контексте выделения памяти
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.03.2017, 20:56
Ну в MS C++, например, new является простой оберткой над malloc,
которая проверяет возвращаемое значение, а затем конструирует объект.
О каком выигрыше в скорости тогда может идти речь?
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
05.03.2017, 20:58  [ТС]
Убежденный,
Ну new вроде как эксепшенами кидается... Значит где то под капотом должен быть throw
Где то читал что throw чего-то там генерит что замедляет выполнение
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.03.2017, 21:12
Ну не знаю, не знаю...
Глянул ассемблерный листинг new - там тупо malloc с проверкой на NULL.
Если не NULL, то сразу выход. Иначе throw. Все. Никаких "побочных"
накладных расходов, связанных с throw, не увидел.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.03.2017, 23:46
Цитата Сообщение от sys_beginner Посмотреть сообщение
Где-то читал, что наличие в коде throw, даже в том случае когда нет try/catch может приводить к некоторым замедлению потому что где-то внутри генерируется специальный код что бы бросить исключение.
Верно ли данное утверждение?
Если говорить именно про замедление, то zero cost exceptions его не создают. Другой вопрос - что вам в нагрузку к этим zero cost exceptions, запросто прилинкуют еще сто кило непонятного мусора. Просто потому что авторам компилятора традиционно лень нормально распилить предварительно скомпилированные библиотеки на "это нужно, это не нужно, здесь рыбу заворачивали". А еще лучше - выкинуть наконец предварительно скомпилированные библиотеки и заменить на header only (да, да, я знаю что компилятор на них может задуматься).
1
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
05.03.2017, 23:56
автор спрашивает что в рантайме под капотом происходит в случае бросания исключения.
какие приседания делаются в рантайме при наличии try/catch блоков в коде.
естественно это все не бесплатно, проседание будет зависеть от реализации компилятора.
но делать выбор в пользу маллока или еще какого-то другого механизма выделения памяти - это большая глупость.
до тех пор, пока вы не уверены в том, что у вас производительность проседает именно из-за этого, писать по другому не стоит. сперва вообще стоит сделать корректно работающий вариант программы. и вот там, где нет исключений, раскрутки стека и прочих плюсовых плюшек написать корректную не текущую программу на много сложнее.

допустим вы решились таки не глядя не использовать исключения. окей. получили программу, потратив в 3 раза больше времени и даже получили результат в производительности. она у вас работает в 1000!!!! раз быстрее, но в целом запускается раз в сутки и работает сто микросекунд, а не 10 миллисекунд. стоило оно того?
2
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.03.2017, 00:51
Цитата Сообщение от DU3 Посмотреть сообщение
допустим вы решились таки не глядя не использовать исключения. окей. получили программу, потратив в 3 раза больше времени и даже получили результат в производительности. она у вас работает в 1000!!!! раз быстрее, но в целом запускается раз в сутки и работает сто микросекунд, а не 10 миллисекунд. стоило оно того?
Зачем в три раза больше времени?
Линукс стайл - malloc всегда успешно выделяет память, потому что технология overcommit (со своими веселыми граблями, да). Обработка ошибок выделения памяти просто ненужна. Вернее, она уже вшита в систему.
Qt-стайл - ошибка выделения памяти, ведет к немедленному аварийному завершению процесса. Вот прям в недрах malloc. Так что никаких дополнительных обработок ошибок опять же не нужно.
Ну да, такие фокусы тоже имеют свою цену, но вы прикиньте, код "в 1000!!!! раз быстрее".
1
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
06.03.2017, 01:00
окей. тогда неплохо бы замерить, на сколько наличие throw замедляет процесс выделения памяти. какая разница в процентах. есть у кого-нибудь данные?
сравнить скажем nothrow new, просто new и маллок какой-нибудь.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.03.2017, 01:29
Цитата Сообщение от DU3 Посмотреть сообщение
окей. тогда неплохо бы замерить, на сколько наличие throw замедляет процесс выделения памяти. какая разница в процентах. есть у кого-нибудь данные?
При zero cost exceptions успешное выделение памяти замедлится на один if(!pointer). А не успешное выделение - аварийная ситуация, которая случается редко, в ней можно и потормозить. Если же исключения собраны на чем-то типа сишных longjmp, то по всему коду будут неявно раскиданы вызовы setjmp, вызываемые всегда. И вот тут я бы не был так уверен в незначительности возникающих тормозов.
Но повторюсь, основной смысл воевать с исключениями - сокращение исполняемого файла. Плюс-минус сто кило статически прилинкованных библиотек, это для маленького проектика весьма много.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
06.03.2017, 06:05
Цитата Сообщение от Renji Посмотреть сообщение
Линукс стайл - malloc всегда успешно выделяет память, потому что технология overcommit (со своими веселыми граблями, да).
Опять же, зависит от настроек данной политики.
Собственно, вот

Цитата Сообщение от DU3 Посмотреть сообщение
окей. тогда неплохо бы замерить, на сколько наличие throw замедляет процесс выделения памяти. какая разница в процентах. есть у кого-нибудь данные?
Будет сильно зависеть от реализации самих исключений.
https://habrahabr.ru/post/208006/
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.03.2017, 06:08
Цитата Сообщение от Croessmah Посмотреть сообщение
Опять же, зависит от настроек данной политики.
Ну по умолчанию то она активна. Хотя да, можно настройки и поменять.
0
06.03.2017, 09:30

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Ну по умолчанию то она активна.
В убунту, вроде, промежуточный вариант по дефолту стоит.
Но я всегда вырубаю overcommit сразу после установки системы.
Пусть уж лучше приложения падаю, если кривые,
нежели жрут непомерно ресурсов.
Какой-нибудь банальный
C++
1
2
while(new int[100500]){
}
может "повесить" систему к чертовой бабушке.
Собственно, когда одно моё тренировочное
приложение для исследования утечек,
стало вешать систему, вот тогда я и узнал о overcommit. :D

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.03.2017, 12:52
Цитата Сообщение от Renji Посмотреть сообщение
Если говорить именно про замедление, то zero cost exceptions его не создают
sys_beginner обычно задаёт вопросы в контексте переносимости кода, правда здесь он об этом не говорил. Но на всякий случай. Zero cost exceptions (обычного термин сокращают до 0eh) - это всего лишь один из методов реализации исключений. На культурных архитектурах типа intel-linux он уже давно работает. На "других" архитектурах - не везде

В любом случае тормоза при работе new vs malloc с оглядкой на наличие 0eh - это просто мелочь по сравнению с тем, что в случае отсутствия 0eh будет обвес вокруг каждого вызова функции в тех местах, где присутствуют объекты с деструктором. Как уже выше описал коллега - в лучшем случае будет просто экономия на спичках. В худшем случае - программа превратится в бесконечно завёрнутую кишку ради экономии пару спичек
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2017, 12:52
Помогаю со студенческими работами здесь

Вывести слова, из которых нельзя составить ключевого слова, ключевое слово вводится отдельно
вывести слова из которых нельзя составить ключевого слова, ключевое слово вводится отдельно.. помогите, все что получается это вот и то не...

Слова текста, которые нельзя составить из «ключевого» слова
Дан произвольный текст на русском языке(который вводится в edit1) . Определить и вывести: Все слова текста, которые нельзя составить из...

Записать в файл все ключевые слова, встречающиеся в программе, указав количество появлений ключевого слова
Дана программа, написанная на языке Pascal. Записать в выходной файл построчно все ключевые слова, встречающиеся в этой программе, указав...

Использование ключевого слова as
Такая интересная штука, у меня есть винформа, при нажатии на кнопу обрабатываю событие и прокидываю это событие в другой класс. При этом...

учет ключевого слова?
предположим есть ссылка на страницу: http://site.ru/slovo1_slovo2_c1">http://site.ru/slovo1_slovo2_c1</a>. Так вот будет ли добавлен вес...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru