nothrow by default

Ola Fosheim Grøstad ola.fosheim.grostad at gmail.com
Sun Jan 5 12:50:20 UTC 2020


On Sunday, 5 January 2020 at 10:32:23 UTC, Johannes Pfau wrote:
> I totally agree to that (memory overhead, TypeInfo, support 
> code). In addition, this overhead means that exceptions are 
> unlikely to be supported in embedded systems, which will lead 
> to a language ecosystem split (this effectively happened to 
> C++).

Not only the overhead, but in real-time interrupts have to be 
100% sure that no code triggers a system call or ends up waiting 
for a lock to be released. Also in applications (e.g. audio 
drivers).

Seems to me that static analysis could be used for this, the same 
way @nogc works.  I think D should look at something more 
comprehensive regarding managing resources instead of these  
tweaks that have very little positive impact.


> Rationale: There are two common ways to handle errors: 
> Backtrace/ exception based and error code based. Both have 
> drawbacks (exceptions: performance, memory / implementation 
> overhead, not supported in embedded systems) (error codes: not 
> "bubbling up" the call stack automatically, no way to force 
> user to check, so might accidentially ignore errors).

Yes, but back-tracing with error codes can be slow.

RAII can be slow.

You can have exceptions in real time systems (setjmp), basically 
just reload saved register values that sets the stack pointer and 
program counter to a consistent state.

So an exception (set jump) can be  much faster than back-tracing 
if you have no RAII on the call stack and all allocations are 
done either on the stack and all other resources are bound to an 
Arena-allocator/manager at the landing pad.

What makes C++-style exceptions slow is the unwind library's 
cross-language design and the surrounding RAII philosophy... 
Exceptions, as a concept, are not necessarily slow. If you can 
just set the stack pointer and jump to the landing pad then you 
have something much faster than returning/unwinding down the call 
stack for deep call-trees.

But since D should be able to call C++ code that won't work, and 
nothrow by default will not help with C++. So to get anywhere you 
first have to figure out how to interact with C++ code. If you 
call C++ code then you cannot assume that it won't throw, unless 
it is marked as "noexcept" and even if it is noexcept it still 
can have landing pads. So you cannot bypass the unwinding 
library... Am I right?

In terms of supporting generic programming it is better to have 
"possibly throws" everywhere.



More information about the Digitalmars-d mailing list