[Issue 24739] New: to!string always allocates a new string

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Sep 1 18:55:47 UTC 2024


https://issues.dlang.org/show_bug.cgi?id=24739

          Issue ID: 24739
           Summary: to!string always allocates a new string
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: performance
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody at puremagic.com
          Reporter: schveiguy at gmail.com

This is a bad and obvious performance issue.

```d
struct S
{
   string toString() { return "S"; }
}

void main()
{
   import std.conv;
   assert(S.init.toString.ptr != S.init.to!string.ptr);
}
```

This assert should not pass -- `to!string` shouldn't do anything other than
call `toString` on a struct.

In fact, if `S.toString` *does* allocate, `to!string` is suffering from an
*extra allocation* -- one for the call to `S.toString`, and one for the
allocated string that `to!string` always builds.

The underlying cause is that the default case for `toImpl!(string, T)` is to
create an appender and then use format. There should be a case for when
`T.toString` is defined.

See
https://github.com/dlang/phobos/blob/f7e523bc3c69506c3e7b4da7e78af93ed8547910/std/conv.d#L1107
and
https://github.com/dlang/phobos/blob/f7e523bc3c69506c3e7b4da7e78af93ed8547910/std/conv.d#L136

--


More information about the Digitalmars-d-bugs mailing list