On Saturday, 12 September 2015 at 06:25:45 UTC, NX wrote:
On Friday, 11 September 2015 at 19:30:56 UTC, ponce wrote:
Some of us use and need @nogc all the time. The other parts of an application can use the GC: best of both worlds.

Is there even a compiler switch to disable GC altogether so the program doesn't have a GC thread? No, I can't see it...

There are a few levels of 'everything @nogc' you can go - make `main` @nogc but still have the runtime initalised, link to `_start @nogc` and intercept it so that it doesn't even start the runtimes, or (for minimising the binary/going bare metal) providing a custom null runtime and not linking the D runtime at all.

From when I tried to make the smallest PE hello world I could for 2.066:

    //Level 1
    void main() @nogc
    {
        //Do stuff
    }

//Level 2 - no runtime initialisation, runtime still there though
    extern(C) void _start() @nogc
    {
//Runtime not started yet - must be initialised before using much of the standard library
    }

//Level 3 - no runtime, trick the linker (it expects runtime hooks)
    extern(C)
    {
        @nogc:

//Custom runtime/moduleinfo stuff - not very portable in my experience - YMMV //Provided so the linker doesn't have any 'runtimeFnHook missing' errors, but we don't actually include the runtime
        __gshared void* _Dmodule_ref;
//Depending on compiler/version, these may have to exist for the linker
        //__gshared void* _d_arraybounds;
        //__gshared void* _d_assert;
        //__gshared void* _d_unittest;
//May want to provide empty bodies instead if your linker can remove unused
        // / garbage functions
        void _d_dso_registry(void* ignore){}

        void _start()
        {
            //Bare metal ready
        }
    }

I needed a few runtime-affecting compiler (and linker) switches too, depending on which compiler I was using, although it was mostly obvious stuff listed in `$(compiler) --help`.

Reply via email to