Re[6]: На сколько затратно выбрасывание исключения
От: drol  
Дата: 01.03.15 22:57
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>но хотелось бы более серьезного доказательства,


Я с большим интересом послушаю эти самые Ваши доказательства. Вы ведь, надеюсь, не забыли, что тезис о переходах в ядро при обычной обработке обычных исключений принадлежит Вам ?

PD>нежели данные счетчиков времени


Лично меня они пока вполне устраивают. Разница с 32-битным процессом WoW64 впечатляет более чем...

PD>Пока что могу лишь сказать, что NtRaiseException как сервис ядра в x64 существует. Вот здесь ее номер даже (в смысле syscall) приведен.


И причём здесь NtRaiseException\ZwRaiseException В приведённом Вами стеке вызовов их нет. Там только RaiseException и RtlRaiseException. Вам напомнить, что означает префикс Rtl ?

Итого, Вы пока не показали вообще ни одного факта перехода в режим ядра

PD>Правда, я не совсем понимаю, что Вы имеете в виду, говоря о необработанном исключении. RaiseException его выбрасывает, а обработка будет потом, если будет


Приехали. А что такое по-Вашему вообще "выбрасывание" ? Сакральный магический акт ?

PD>Получается, что если обработки не будет, то управление вернется обратно в RaiseException,


И когда обработка есть оно туда тоже возвращается. Причём n раз (в данном примере SEH + куча вложенных __finally\__except):

testCppExceptions.exe!main$fin$0()
msvcr120d.dll!__C_specific_handler()
ntdll.dll!RtlpExecuteHandlerForUnwind()
ntdll.dll!RtlUnwindEx()
msvcr120d.dll!__C_specific_handler()
ntdll.dll!RtlpExecuteHandlerForException()
ntdll.dll!RtlDispatchException()
ntdll.dll!KiUserExceptionDispatch()
KernelBase.dll!RaiseException()
msvcr120d.dll!_CxxThrowException()
testCppExceptions.exe!main(int argc, char * * argv)

*И эти люди преподают программирование на C\C++

PD>Или она сама и должна заниматься обработкой исключения ?


Совершенно верно...

*Понятно, что не собственно RaiseException, а то что вызывается внутри неё. Основная логика находится в RtlRaiseException и в RtlDispatchException.

PD>Так не ее же это дело, исключения могут и без нее возникнуть вполне.


Что значит "без неё" Нормальное исключение это и есть вызов кого-то из xxxRaiseException. Для "ядерных приветов" имеются оптимизации, которые передают управление сразу на уровень KiUserExceptionDispatch.

PD>Что-то я не понимаю.


Вы очень много чего не понимаете...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.