And what, if anything, can I do to avoid it?

        string[] arr = ["abcd", "efgh", "ijkl"];
        char[4096] buf;
        char[] res;
        writeln(GC.stats);
        res = sformat(buf, "%s", arr);
        assert(res.ptr == buf.ptr);
        writeln(res);
        writeln(GC.stats);
        res = sformat(buf, "%s", arr);
        assert(res.ptr == buf.ptr);
        writeln(res);
        writeln(GC.stats);

        // Results:
        Stats(64, 1048512, 80)
        ["abcd", "efgh", "ijkl"]
        Stats(272, 1048304, 272)
        ["abcd", "efgh", "ijkl"]
        Stats(464, 1048112, 464)

I get similar behavior trying to use formattedWrite with an appender:

        string[] arr = ["abcd", "efgh", "ijkl"];
        auto formatBuffer = appender!(char[])();
        formatBuffer.reserve(4096);
        formatBuffer.clear();
        writeln(GC.stats);
        formatBuffer.formattedWrite!"%s"(arr);
        writeln(formatBuffer.data);
        writeln(GC.stats);
        formatBuffer.clear();
        formatBuffer.formattedWrite!"%s"(arr);
        writeln(formatBuffer.data);
        writeln(GC.stats);

        // Results:
        Stats(12288, 5230592, 4208)
        ["abcd", "efgh", "ijkl"]
        Stats(12432, 5230448, 4352)
        ["abcd", "efgh", "ijkl"]
        Stats(12576, 5230304, 4496)

Same thing if I use a format string like "%(%s,%)" rather than just "%s". I'm guessing it's allocating a string first to write the contents of the array and then inserting that string into the buffer I supplied. Is there no way to have it skip this step and just write each element (plus the joining punctuation, etc) directly into the buffer?

Reply via email to