iPhone vs Android
deadalnix via Digitalmars-d
digitalmars-d at puremagic.com
Wed Sep 14 12:13:13 PDT 2016
On Wednesday, 14 September 2016 at 07:55:24 UTC, John Colvin
wrote:
> On Tuesday, 13 September 2016 at 22:28:09 UTC, deadalnix wrote:
>> On Tuesday, 13 September 2016 at 22:19:54 UTC, Jonathan M
>> Davis wrote:
>>> The big problem with exceptions being allocated by the GC
>>> isn't really the GC but @nogc.
>>
>> No the problem IS @nogc . Allocating with the GC is absolutely
>> not a problem is you deallocate properly. What is a problem is
>> when you leak (ie, when the ownership is transferred to the
>> GC). If you don't leak, GC do not kicks in.
>
> Can you explain a bit more here? Do you mean in practice (I.e.
> in current implementation) or in theory?
My point is that if you have lifetime information for some data
(and it looks like this is where we want to go with things like
DIP25 and DIP1000, but let's not get lost in the specific of
these proposal now) you know they are going to end up being freed
without the GC having to do a collection cycle.
Therefore, you know you'll not end up having to rely on the GC as
long as you can track lifetime, even if you allocate with it.
Now that this is established it follows that disallowing GC
allocation in @nogc code is needlessly restrictive and promote
unsafe patterns (like allocating using malloc + giving the range
to the GC, which is both slower than allocating on the GC
directly and more error prone).
A more sensible approach is to allow GC allocation in @nogc code
but disallow cases where GC's alloc lifetime cannot be tracked.
Note that this isn't the case for most exceptions.
For instance, when you do
throw new Exception("tagada");
The compiler can deduce that the ownership of the exception is
transferred to the runtime, which will transfers back to the
catch block that gets it. Depending of what this catch block is
doing, it may or may not be @nogc, but there is no reason that
for throw to not be allowed in @nogc code.
However, if you have something like
throw e;
With e a reference to an Exception who's lifetime cannot be
tracked, then it makes sense to disallow it in @nogc code.
TL;DR : The problem is not new, the problem is the rhs of
assignment operations.
More information about the Digitalmars-d
mailing list