On Monday, 13 April 2015 at 19:10:28 UTC, Steven Schveighoffer wrote:
It would be nice if alloca could be wrapped so it could be made safe(r).

string stackArray(T)(string name, string len) {
    import std.format : format;
    return q{
        import core.stdc.stdlib : alloca;
        import std.conv : emplace;

        size_t %2$s_length_ = %3$s;
%1$s* %2$s_storage_ = cast(%1$s*) alloca(%2$s_length_ * %1$s.sizeof);
        %1$s[] %2$s = %2$s_storage_[0 .. %2$s_length_];
        foreach(ref ele; %2$s)
            emplace(&ele);
    }.format(T.stringof, name, len);
}

void main(string[] args)
{
    import std.conv : to;
    import std.stdio : writefln;

    mixin(stackArray!int("arr", q{ args[1].to!size_t }));

    writefln("allocated an array of %s bytes", arr.length);
    writefln("arr = %s", arr);
}


This is the best I can come up with currently. I think with a @forceinline attribute, it would be a lot better, assuming `alloca()` is usable inside an inlined method.

Reply via email to