mimik написав:А, як ви відноситесь до використання exceptions в С++?
Відмінно ставлюся. Застосовувати треба вміти і все буде добре.
mimik написав:[...] Написання коду без використання throw та try/catch блоків. Як часто таке практикується в сучасному С++ у реальних проектах?
Два випадки, коли відключення винятків виправдане:
Середовище, в якому запускається програма, недружнє, або не підтримує виключення (див. сюди);
Для програми потрібні гарантії безперервності у довільному місці.
У першому випадку код пишуть без винятків, бо їх неможливо підтримати. Отже, відключення генерації виключень супровідним кодом - це наслідок відсутності цієї підтримки. Навіщо роздувати код тим, що ніколи не використовуватиметься?
У другому випадку код спеціально пишуть так, щоб його переривання було неможливим. Отже, відключення генерації виключень супровідним кодом - це наслідок цієї вимоги. Навіщо роздувати код тим, що ніколи не використовуватиметься?
mimik написав:Дуже часто пишуть, що exceptions не є дешевими і якщо важлива продуктивність, то краще використовувати if/else і передавати помилку через них.
Тут можна об'єктивно посперечатися.
// With exceptions
calculate(): # @calculate()
push rax
mov rdi, qword ptr [rip + sz]
call allocate(unsigned long)
mov rsi, qword ptr [rip + sz]
mov rdi, rax
pop rax
jmp foo(int*, unsigned long) # TAILCALL
https://godbolt.org/z/jsaYxTP33
// Without exceptions
calculate(): # @calculate()
push rax
mov rdi, qword ptr [rip + sz]
call allocate(unsigned long)
test rax, rax
je .LBB1_1
mov rsi, qword ptr [rip + sz]
mov rdi, rax
pop rax
jmp foo(int*, unsigned long) # TAILCALL
.LBB1_1:
pop rax
ret
https://godbolt.org/z/8nczeK1G7
Там я навмисно відключив деякі оптимізації, щоб наблизити код до реальних умов.
Звичайно, сам процес розкручування стека не швидкий. Але при грамотному розподілі обробників (йдеться не про впихання try-catch в кожну функцію) конкретні функції виконуватимуться швидше в штатних ситуаціях.
У прикладі я зробив лише одну перевірку, а тепер уявіть, що таких перевірок там могла б бути сотня.
Якщо ми пишемо код із винятками і не намагаємося їх обробляти в стилі кодів повернення, то жодного уповільнення від їх роботи не буде або воно буде в межах похибки.