DIP60: @nogc attribute

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Tue Apr 15 12:20:41 PDT 2014


On 4/15/2014 12:12 PM, Steven Schveighoffer wrote:
>>> What about syscalls?
>>
>> Not sure what you mean by that, but obviously Windows API functions would be
>> @nogc.
>
> Linux syscalls are not Windows API, they are extern(C) calls. Basically, we will
> have to mark most as @nogc, right?

Right, just like nothrow.


> or are extern(C) calls automatically considered @nogc?

No, just like for nothrow.


> int isthisok(int x, int y) @nogc
> {
>     // need scratch space
>     int[] buf = new int[x * y];
>     scope(exit) GC.free(buf.ptr);
>     // perform some algorithm using buf
>     ...
>     //
>     return buf[$-1];
> }
>
> Valid?

No.


>>> Must you use C malloc/free?
>>
>> If you can GC/GCfree, then you can use malloc/free.
>
> What if you can't use GC/GCfree? i.e. @nogc (the point of this thread)

Then use malloc/free.


>>> What about such code that is @safe, which cannot call free?
>>
>> There's no point to @nogc if you can still call the GC in it.
>
> This is a follow-on to the previous question. Let's say you cannot use GC, but
> clearly, I can use C malloc/free. Safe code that needs arbitrary buffers must
> use C malloc/free to manage them, but safe cannot legally call free.

That's why @trusted exists.


> I think we would need some sort of scoped allocator to make life bearable.

     p = malloc(...);
     scope(exit) free(p);

Let's be clear about the motivation for @nogc - there are a lot of people who 
will not use D because of fear of GC. They want a guarantee that the GC isn't 
being called. They don't want code that hides calls to GC.


More information about the Digitalmars-d mailing list