Stuff in Phobos That Generates Garbage

From D Wiki
Revision as of 23:12, 9 November 2014 by DmitryOlshansky (talk | contribs) (Labeled data: Add recent output with some CTFE blacklisted and more accurate function id's.)
Jump to: navigation, search

Potential solutions

Closure allocations

CL01: Fixable by manually stack-allocating closure

  A delegate is passed to some function which stores this delegate and
  therefore correctly doesn't mark the parameter as scope. However,
  the lifetime of the stored delegate is still limited to the current
  function (e.g. it's stored in a struct instance, but on the stack).
  Can be fixed by creating a static struct{T... members; void
  doSomething(){access members}} instance on stack and passing
  &stackvar.doSomething as delegate.

CL02: Using delegates to add state to ranges

  ----
  return iota(dim).
    filter!(i => ptr[i])().
    map!(i => BitsSet!size_t(ptr[i], i * bitsPerSizeT))().
    joiner();
  ----
  This code adds state to ranges without declaring a new type: the ptr
  variable is not accessible and needs to be move into a closure.
  Declaring a custom range type is a solution, but not
  straightforward: If the ptr field is moved into the range a closure
  is not necessary. But if the range is copied, it's address changes
  and the delegate passed to map is now invalid.

CL03: Functions taking delegates as generic parameters

  receiveTimeout,receive,formattedWrite accept different types,
  including delegates. The delegates can all be scope to avoid the
  allocation but is void foo(T)(scope T) a good idea? The alternative
  is probably making an overload for delegates with scope attribute.
  (The result is that all functions calling receiveTimeout,... with a
  delegate allocate a closure)

CL04: Solvable with manual memory management

  Some specific functions can't be easily fixed, but the delegates
  they create have a well defined lifetime (for example spawn creates
  a delegate which is only needed at the startup of a new thread, it's
  never used again). These could be malloc+freed.

CL05: Design issue

  These functions generally create a delegate using variables passed
  in as parameters. There's no way to avoid closures here. Although
  manual allocation is an possible, the lifetime is undefined and can
  only be managed by the GC.

CL06: Other

  Two cases can be fixed by moving a buffer into a struct or moving a
  function out of a member function into it's surrounding class.

Labeled data

Here are the results based on the compiler's report (building Phobos unittests with -vgc flag of DMD).

For templates only code that is _instantiated_ by unittests build is accounted for (~ all covered code).

The tool used to post-process -vgc output can be found here, it's not tied to Phobos and should work with any github-based project (to be extended).


Module Artifact Reason Possible Fix(es)
std.algorithm TimSortImpl.ensureCapacity setting 'length' may cause GC allocation 1
std.algorithm TimSortImpl.sort setting 'length' may cause GC allocation 1
std.array Appender.ensureAddable 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.array Appender.this 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.array array operator ~= may cause GC allocation 1
std.array arrayAllocImpl 'new' causes GC allocation 1 2
std.array insertInPlace.trustedMemcopy setting 'length' may cause GC allocation 1
std.bigint BigInt.checkDivByZero 'new' causes GC allocation 1
std.bigint BigInt.toString 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.bigint toDecimalString.sink operator ~= may cause GC allocation 1
std.bigint toHex.sink operator ~= may cause GC allocation 1
std.bitmanip BitArray.length setting 'length' may cause GC allocation 1
std.bitmanip BitArray.toString 'new' causes GC allocation;

operator ~ may cause GC allocation; using closure causes GC allocation 1 2 3

CL2
std.bitmanip myToString operator ~ may cause GC allocation 1
std.bitmanip myToStringx operator ~ may cause GC allocation 1
std.complex Complex.toString operator ~= may cause GC allocation 1 CL3
std.concurrency List.put 'new' causes GC allocation 1
std.concurrency MessageBox.get.onLinkDeadMsg 'new' causes GC allocation 1 2
std.concurrency MessageBox.get.pty 'new' causes GC allocation 1
std.concurrency MessageBox.this 'new' causes GC allocation 1 2 3
std.concurrency create.wrap 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2

std.concurrency dispatch using closure causes GC allocation 1
std.concurrency newCondition 'new' causes GC allocation 1 2
std.concurrency onCrowdingThrow 'new' causes GC allocation 1
std.concurrency register indexing an associative array may cause GC allocation;

operator ~= may cause GC allocation 1 2 3

std.concurrency spawn 'new' causes GC allocation 1
std.concurrency this 'new' causes GC allocation 1 CL4
std.concurrency thisTid 'new' causes GC allocation 1
std.conv convError 'new' causes GC allocation 1 2
std.conv parse 'new' causes GC allocation 1 2 3
std.conv parseError 'new' causes GC allocation 1
std.conv strippedOctalLiteral operator ~= may cause GC allocation 1
std.conv textImpl operator ~= may cause GC allocation 1
std.conv toImpl 'new' causes GC allocation 1 2 3
std.cstream seek 'new' causes GC allocation 1
std.cstream this 'new' causes GC allocation 1 2 3
std.csv toString operator ~ may cause GC allocation 1
std.datetime Date.dayOfYear 'new' causes GC allocation 1
std.datetime Date.yearBC 'new' causes GC allocation 1 2
std.datetime DosFileTimeToSysTime 'new' causes GC allocation 1 2
std.datetime FILETIMEToStdTime 'new' causes GC allocation 1
std.datetime SYSTEMTIMEToSysTime.throwLaterThanMax 'new' causes GC allocation 1
std.datetime SysTime.fracSec 'new' causes GC allocation 1
std.datetime SysTime.fracSecs 'new' causes GC allocation 1 2
std.datetime SysTime.this 'new' causes GC allocation 1 2 3
std.datetime SysTime.toISOExtString operator ~ may cause GC allocation 1 2
std.datetime SysTime.toISOString operator ~ may cause GC allocation 1 2
std.datetime SysTime.toSimpleString operator ~ may cause GC allocation 1 2
std.datetime SysTimeToDosFileTime 'new' causes GC allocation 1 2
std.datetime SysTimeToSYSTEMTIME 'new' causes GC allocation 1
std.datetime TimeZone.getTimeZone 'new' causes GC allocation 1
std.datetime _enforceValidTZFile 'new' causes GC allocation 1
std.datetime dstName operator ~= may cause GC allocation 1
std.datetime enforceValid 'new' causes GC allocation 1 2 3 4 5
std.datetime getInstalledTZNames 'delete' requires GC;

'new' causes GC allocation 1 2 3

std.datetime getTimeZone 'delete' requires GC;

'new' causes GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

std.datetime monthFromString 'new' causes GC allocation 1
std.datetime readVal 'new' causes GC allocation 1
std.datetime stdName operator ~= may cause GC allocation 1
std.datetime stdTimeToFILETIME 'new' causes GC allocation 1
std.digest.digest finish 'new' causes GC allocation 1
std.digest.digest peek 'new' causes GC allocation 1
std.digest.digest toHexString 'new' causes GC allocation 1 string toHexString(ubyte[] data): Provide ouput range and/or RCString overload
std.encoding EncoderFunctions.WriteToString.write operator ~= may cause GC allocation 1
std.encoding EncodingScheme.create 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.encoding EncodingScheme.register 'new' causes GC allocation;

indexing an associative array may cause GC allocation; operator ~ may cause GC allocation 1 2 3

std.encoding EncodingScheme.sanitize 'new' causes GC allocation 1
std.encoding names array literal may cause GC allocation 1 2 3 4 5 6
std.encoding transcode 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.exception bailOut 'new' causes GC allocation 1
std.exception enforceEx.enforceEx 'new' causes GC allocation 1
std.exception errnoEnforce 'new' causes GC allocation 1
std.exception this operator ~ may cause GC allocation 1
std.file DirEntry.this 'new' causes GC allocation 1
std.file cenforce 'new' causes GC allocation 1
std.file copy 'new' causes GC allocation 1
std.file ensureDirExists 'new' causes GC allocation 1
std.file getFileAttributesWin 'new' causes GC allocation 1
std.file popFront using closure causes GC allocation 1
std.file read 'delete' requires GC 1
std.file rename 'new' causes GC allocation 1
std.file rmdirRecurse 'new' causes GC allocation 1
std.file thisExePath setting 'length' may cause GC allocation 1
std.format FormatSpec.fillUp 'new' causes GC allocation 1 2
std.format doFormat.formatArg.putAArray 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5

std.format doFormat.formatArg.putreal 'new' causes GC allocation 1
std.format doFormat.getFmtChar 'new' causes GC allocation 1
std.format doFormat.getFmtInt 'new' causes GC allocation 1 2
std.format doFormat.getFmtStar 'new' causes GC allocation 1 2
std.format formatNth.gencode operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2

std.format formatRange 'new' causes GC allocation 1
std.format getNthInt 'new' causes GC allocation 1 2
std.format primitiveTypeInfo associative array literal may cause GC allocation 1
std.functional memoize.memoize indexing an associative array may cause GC allocation 1
std.getopt splitAndGet operator ~ may cause GC allocation 1 2 3
std.internal.math.biguintcore BigUint.div 'new' causes GC allocation;

array literal may cause GC allocation 1 2

std.internal.math.biguintcore BigUint.divInt 'new' causes GC allocation 1
std.internal.math.biguintcore BigUint.fromDecimalString 'new' causes GC allocation;

array literal may cause GC allocation; setting 'length' may cause GC allocation 1 2 3

std.internal.math.biguintcore BigUint.fromHexString 'new' causes GC allocation;

array literal may cause GC allocation 1 2

std.internal.math.biguintcore BigUint.mod 'new' causes GC allocation;

array literal may cause GC allocation 1 2 3

std.internal.math.biguintcore BigUint.modInt 'delete' requires GC;

'new' causes GC allocation 1 2

std.internal.math.biguintcore BigUint.mul 'new' causes GC allocation;

array literal may cause GC allocation 1 2

std.internal.math.biguintcore BigUint.opAssign array literal may cause GC allocation 1 2 3 4 5 6
std.internal.math.biguintcore BigUint.opShl 'new' causes GC allocation 1
std.internal.math.biguintcore BigUint.pow 'new' causes GC allocation;

array literal may cause GC allocation 1 2 3

std.internal.math.biguintcore BigUint.toDecimalString 'new' causes GC allocation 1
std.internal.math.biguintcore BigUint.toHexString 'new' causes GC allocation 1
std.internal.math.biguintcore add 'new' causes GC allocation 1
std.internal.math.biguintcore addInt 'new' causes GC allocation 1
std.internal.math.biguintcore biguintFromDecimal 'new' causes GC allocation 1
std.internal.math.biguintcore biguintToDecimal setting 'length' may cause GC allocation 1
std.internal.math.biguintcore blockDivMod 'delete' requires GC;

'new' causes GC allocation 1 2

std.internal.math.biguintcore divModInternal 'delete' requires GC;

'new' causes GC allocation 1 2 3 4

std.internal.math.biguintcore includeSign 'new' causes GC allocation 1
std.internal.math.biguintcore mulInternal 'delete' requires GC;

'new' causes GC allocation 1 2 3 4

std.internal.math.biguintcore squareInternal 'delete' requires GC;

'new' causes GC allocation 1 2

std.internal.math.biguintcore sub 'new' causes GC allocation 1 2
std.internal.math.biguintcore subInt 'new' causes GC allocation 1
std.internal.windows.advapi32 freeAdvapi32 'new' causes GC allocation 1
std.internal.windows.advapi32 loadAdvapi32 'new' causes GC allocation 1 2
std.json JSONValue.opIndex operator ~ may cause GC allocation 1
std.json toJSON.toString 'new' causes GC allocation 1
std.json toJSON.toValue.emit indexing an associative array may cause GC allocation 1
std.net.curl AsyncChunkInputRange.this 'new' causes GC allocation 1
std.net.curl Curl.clearIfSupported using closure causes GC allocation 1
std.net.curl Curl.onReceive using closure causes GC allocation 1
std.net.curl Curl.onReceiveHeader using closure causes GC allocation 1
std.net.curl Curl.onSeek using closure causes GC allocation 1
std.net.curl Curl.onSend using closure causes GC allocation 1
std.net.curl Curl.onSocketOption using closure causes GC allocation 1
std.net.curl FTP.url operator ~ may cause GC allocation 1
std.net.curl HTTP.Impl.onReceiveHeader indexing an associative array may cause GC allocation 1
std.net.curl HTTP.url operator ~ may cause GC allocation 1
std.net.curl Pool.push 'new' causes GC allocation 1
std.net.curl WorkerThreadProtocol.wait using closure causes GC allocation 1 CL3
std.net.curl _finalizeAsyncChunks setting 'length' may cause GC allocation 1 CL3
std.net.curl _getForRange using closure causes GC allocation 1 CL3
std.net.curl decodeLineInto using closure causes GC allocation 1 CL5
std.net.curl dup using closure causes GC allocation 1 CL5
std.net.curl push using closure causes GC allocation 1 CL5
std.numeric Fft.this 'new' causes GC allocation 1
std.outbuffer OutBuffer.reserve setting 'length' may cause GC allocation 1
std.parallelism Task.executeInNewThread 'new' causes GC allocation 1 2
std.parallelism TaskPool.abstractPutGroupNoSync 'new' causes GC allocation 1
std.parallelism TaskPool.abstractPutNoSync 'new' causes GC allocation 1
std.parallelism TaskPool.this 'new' causes GC allocation 1 2 3 4 5 6 7
std.parallelism foreachErr 'new' causes GC allocation 1
std.parallelism submitAndExecute 'new' causes GC allocation 1
std.parallelism taskPool 'new' causes GC allocation 1
std.path absolutePath 'new' causes GC allocation 1
std.path buildNormalizedPath 'new' causes GC allocation 1 2
std.path buildPath 'new' causes GC allocation 1
std.path globMatch operator ~ may cause GC allocation 1
std.process ProcessPipes.stderr 'new' causes GC allocation 1
std.process ProcessPipes.stdin 'new' causes GC allocation 1
std.process ProcessPipes.stdout 'new' causes GC allocation 1
std.process charAllocator 'new' causes GC allocation 1
std.process environment.getImpl 'new' causes GC allocation 1
std.process environment.opIndex operator ~ may cause GC allocation 1
std.process environment.toAA indexing an associative array may cause GC allocation 1
std.process escapeShellArguments.allocator 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.process escapeShellCommand operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2

std.process escapeShellFileName operator ~ may cause GC allocation 1 2
std.process escapeWindowsShellCommand 'new' causes GC allocation 1 2
std.process kill 'new' causes GC allocation 1 2
std.process newFromErrno 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.process newFromLastError 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.process pipe 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.process pipeProcessImpl 'new' causes GC allocation 1 2
std.process shell operator ~ may cause GC allocation 1
std.process spawnProcessImpl 'new' causes GC allocation 1
std.process spawnProcessImpl.prepareStream 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3

std.process spawnShell operator ~ may cause GC allocation 1
std.random MersenneTwisterEngine.seed 'new' causes GC allocation 1
std.range popBackN 'new' causes GC allocation 1
std.range put array literal may cause GC allocation 1
std.range roundRobin.Result.front.makeSwitch operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6

std.range roundRobin.Result.popFront.makeSwitchIncrementCounter operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4

std.range roundRobin.Result.popFront.makeSwitchPopFront operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6

std.regex.internal.ir disassemble operator ~ may cause GC allocation 1 2
std.regex.internal.ir getTrie indexing an associative array may cause GC allocation 1
std.regex.internal.kickstart ShiftOr.fetch setting 'length' may cause GC allocation 1
std.regex.internal.kickstart ShiftOr.this 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6

std.regex.internal.parser Parser.charsetToIr operator ~= may cause GC allocation 1 2 3
std.regex.internal.parser Parser.error 'new' causes GC allocation 1
std.regex.internal.parser Parser.markBackref setting 'length' may cause GC allocation 1
std.regex.internal.parser Parser.parseFlags 'new' causes GC allocation 1 2
std.regex.internal.parser Parser.parseQuantifier operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.regex.internal.parser Parser.parseRegex operator ~= may cause GC allocation 1 2
std.regex.internal.parser Parser.put operator ~= may cause GC allocation 1
std.regex.internal.parser Parser.putRaw operator ~= may cause GC allocation 1
std.regex.internal.parser Stack.push operator ~= may cause GC allocation 1
std.regex.internal.parser getTrie indexing an associative array may cause GC allocation 1
std.regex.internal.parser lightPostprocess 'new' causes GC allocation 1 2
std.regex.internal.parser parseUniHex 'new' causes GC allocation 1
std.regex.internal.parser reverseBytecode 'new' causes GC allocation 1
std.regex.internal.thompson ThompsonMatcher.eval indexing an associative array may cause GC allocation 1 2
std.regex.package Captures.newMatches 'new' causes GC allocation 1
std.socket Address.toHostString 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5

std.socket Address.toServiceString 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4 5

std.socket Address.toString operator ~ may cause GC allocation 1 2
std.socket InternetHost.populate 'new' causes GC allocation 1 2
std.socket InternetHost.validHostent 'new' causes GC allocation 1
std.socket Protocol.populate 'new' causes GC allocation 1
std.socket Service.populate 'new' causes GC allocation 1
std.socket Socket.accept 'new' causes GC allocation 1
std.socket Socket.accepting 'new' causes GC allocation 1
std.socket Socket.bind 'new' causes GC allocation 1
std.socket Socket.blocking 'new' causes GC allocation 1
std.socket Socket.connect 'new' causes GC allocation 1
std.socket Socket.createAddress 'new' causes GC allocation 1 2 3
std.socket Socket.getOption 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3

std.socket Socket.hostName 'new' causes GC allocation 1
std.socket Socket.listen 'new' causes GC allocation 1
std.socket Socket.localAddress 'new' causes GC allocation 1 2
std.socket Socket.remoteAddress 'new' causes GC allocation 1 2
std.socket Socket.select 'new' causes GC allocation 1
std.socket Socket.setKeepAlive 'new' causes GC allocation 1
std.socket Socket.setOption 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.socket Socket.this 'new' causes GC allocation 1 2
std.socket SocketSet.add setting 'length' may cause GC allocation 1 2
std.socket SocketSet.resize setting 'length' may cause GC allocation 1
std.socket getAddress 'new' causes GC allocation;

operator ~= may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4 5

std.socket getAddressInfoImpl 'new' causes GC allocation 1 2 3
std.socket parse 'new' causes GC allocation 1
std.socket parseAddress 'new' causes GC allocation 1 2
std.socket serviceToPort 'new' causes GC allocation 1
std.socket socketPair 'new' causes GC allocation 1 2 3
std.socket this 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.socket toHostNameString 'new' causes GC allocation 1
std.socketstream seek 'new' causes GC allocation 1
std.stdio File.ByChunk.this 'new' causes GC allocation 1
std.stdio File.close operator ~ may cause GC allocation 1
std.stdio File.lock operator ~ may cause GC allocation 1
std.stdio File.seek operator ~ may cause GC allocation 1
std.stdio File.setvbuf operator ~ may cause GC allocation 1 2
std.stdio File.tell operator ~ may cause GC allocation 1
std.stdio File.tryLock operator ~ may cause GC allocation 1
std.stdio File.unlock operator ~ may cause GC allocation 1
std.stdio File.wenforce 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2 3 4

std.stdio opCall 'new' causes GC allocation 1 2
std.stdio this operator ~ may cause GC allocation 1
std.stream Stream.assertReadable 'new' causes GC allocation 1
std.stream Stream.assertSeekable 'new' causes GC allocation 1
std.stream Stream.assertWriteable 'new' causes GC allocation 1
std.stream Stream.flush setting 'length' may cause GC allocation 1
std.stream Stream.getc setting 'length' may cause GC allocation 1
std.stream Stream.getcw 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.stream Stream.readExact 'new' causes GC allocation 1
std.stream Stream.readLine operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.stream Stream.readLineW operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.stream Stream.readString 'new' causes GC allocation 1
std.stream Stream.readStringW 'new' causes GC allocation 1
std.stream Stream.toString 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2 3

std.stream Stream.ungetc operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2

std.stream Stream.ungetcw operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2

std.stream Stream.vreadf operator ~= may cause GC allocation 1 2
std.stream Stream.writeExact 'new' causes GC allocation 1
std.stream TreadLine.readLine operator ~= may cause GC allocation 1
std.stream close 'delete' requires GC 1
std.stream data 'new' causes GC allocation 1
std.stream flush 'new' causes GC allocation 1
std.stream getcw 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2

std.stream open 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.stream readStringW 'new' causes GC allocation 1
std.stream reserve setting 'length' may cause GC allocation 1
std.stream seek 'new' causes GC allocation 1
std.stream this 'new' causes GC allocation 1 2 3 4
std.string abbrev indexing an associative array may cause GC allocation 1 2
std.string format 'new' causes GC allocation;

using closure causes GC allocation 1 2

CL6
std.string makeTrans 'new' causes GC allocation 1
std.string rightJustify 'new' causes GC allocation 1 2
std.string sformat 'new' causes GC allocation 1
std.string soundex 'new' causes GC allocation 1
std.string toStringz 'new' causes GC allocation 1
std.syserror SysError.msg 'new' causes GC allocation 1
std.traits demangleFunctionAttributes associative array literal may cause GC allocation;

indexing an associative array may cause GC allocation 1 2

std.typecons this operator ~ may cause GC allocation 1
std.uni GcPolicy.alloc 'new' causes GC allocation 1
std.uni GcPolicy.append operator ~= may cause GC allocation 1
std.uni GcPolicy.realloc setting 'length' may cause GC allocation 1
std.uni InversionList.dropUpTo array literal may cause GC allocation 1
std.uni InversionList.inverted array literal may cause GC allocation 1 2
std.uni InversionList.skipUpTo array literal may cause GC allocation 1
std.uni InversionList.this operator ~= may cause GC allocation 1 2
std.uni MultiArray.length.length setting 'length' may cause GC allocation 1 2
std.uni MultiArray.this 'new' causes GC allocation 1
std.uni compressTo operator ~= may cause GC allocation 1 2 3 4 5 6
std.uni encodeTo 'new' causes GC allocation 1
std.uni genUnrolledSwitchSearch operator ~= may cause GC allocation 1 2 3
std.uni isPrettyPropertyName array literal may cause GC allocation 1
std.uni toCaseInPlaceAlloc.toCaseInPlaceAlloc 'new' causes GC allocation 1
std.uni unicode.loadAny 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.uri URI_Encode 'new' causes GC allocation 1 2 3 4 5
std.uri this operator ~ may cause GC allocation 1
std.utf decodeImpl 'new' causes GC allocation 1
std.utf decodeImpl.exception 'new' causes GC allocation 1 2
std.utf encode 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14

std.utf strideBack 'new' causes GC allocation 1
std.utf strideImpl 'new' causes GC allocation 1
std.utf this operator ~ may cause GC allocation 1
std.utf toString operator ~= may cause GC allocation 1 2 3
std.utf toUCSindex 'new' causes GC allocation 1
std.utf toUTF16 operator ~= may cause GC allocation;

setting 'length' may cause GC allocation 1 2 3 4 5

std.utf toUTF32 setting 'length' may cause GC allocation 1 2
std.utf toUTF8 setting 'length' may cause GC allocation 1 2 3 4
std.uuid UUID.this 'new' causes GC allocation 1 2 3 4 5
std.variant VariantN.get 'new' causes GC allocation 1
std.variant VariantN.handler 'new' causes GC allocation 1
std.variant VariantN.handler.tryPutting 'new' causes GC allocation;

array literal may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6 7

std.variant VariantN.opCmp 'new' causes GC allocation 1
std.variant this operator ~ may cause GC allocation 1
std.windows.charset fromMBSz 'new' causes GC allocation;

operator ~ may cause GC allocation; setting 'length' may cause GC allocation 1 2 3

std.windows.charset toMBSz 'new' causes GC allocation;

operator ~ may cause GC allocation; setting 'length' may cause GC allocation 1 2 3

std.windows.registry Key.createKey 'new' causes GC allocation 1 2
std.windows.registry Key.deleteKey 'new' causes GC allocation 1
std.windows.registry Key.getKey 'new' causes GC allocation 1 2
std.windows.registry Key.getValue 'new' causes GC allocation 1
std.windows.registry Key.keyNames 'new' causes GC allocation 1
std.windows.registry Key.keys 'new' causes GC allocation 1
std.windows.registry Key.setValue 'new' causes GC allocation 1
std.windows.registry Key.valueNames 'new' causes GC allocation 1
std.windows.registry Key.values 'new' causes GC allocation 1
std.windows.registry Registry.classesRoot 'new' causes GC allocation 1
std.windows.registry Registry.currentConfig 'new' causes GC allocation 1
std.windows.registry Registry.currentUser 'new' causes GC allocation 1
std.windows.registry Registry.dynData 'new' causes GC allocation 1
std.windows.registry Registry.localMachine 'new' causes GC allocation 1
std.windows.registry Registry.performanceData 'new' causes GC allocation 1
std.windows.registry Registry.users 'new' causes GC allocation 1
std.windows.registry Value.value_EXPAND_SZ 'new' causes GC allocation 1
std.windows.registry enforceSucc 'new' causes GC allocation 1
std.windows.registry regCreateKey operator ~ may cause GC allocation 1
std.windows.registry regDeleteKey operator ~ may cause GC allocation 1
std.windows.registry regDeleteValue operator ~ may cause GC allocation 1
std.windows.registry regEnumKeyName setting 'length' may cause GC allocation 1
std.windows.registry regEnumValueName setting 'length' may cause GC allocation 1
std.windows.registry regGetValueType operator ~ may cause GC allocation 1
std.windows.registry regOpenKey operator ~ may cause GC allocation 1
std.windows.registry regProcessNthKey 'new' causes GC allocation 1
std.windows.registry regProcessNthValue 'new' causes GC allocation 1
std.windows.registry regQueryValue 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

std.windows.registry regSetValue operator ~ may cause GC allocation 1
std.windows.syserror sysErrorString 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.windows.syserror wenforce 'new' causes GC allocation 1
std.xml Check.fail 'new' causes GC allocation 1 2 3
std.xml ElementParser.parse 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11

std.xml Item.pretty array literal may cause GC allocation 1
std.xml Tag.this 'new' causes GC allocation;

indexing an associative array may cause GC allocation; operator ~ may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4 5 6 7

std.xml Tag.toEmptyString operator ~ may cause GC allocation 1
std.xml Tag.toEndString operator ~ may cause GC allocation 1
std.xml Tag.toNonEndString operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2

std.xml Tag.toStartString operator ~ may cause GC allocation 1
std.xml appendItem operator ~= may cause GC allocation 1
std.xml assertNot 'new' causes GC allocation;

using closure causes GC allocation 1 2

CL6
std.xml check 'new' causes GC allocation 1
std.xml checkAttValue operator ~ may cause GC allocation 1
std.xml checkElement operator ~ may cause GC allocation 1
std.xml checkEnd 'new' causes GC allocation;

operator ~ may cause GC allocation 1 2

std.xml checkLiteral operator ~ may cause GC allocation 1
std.xml decode 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10 11

std.xml exit 'new' causes GC allocation 1
std.xml opCatAssign operator ~= may cause GC allocation 1 2 3 4 5
std.xml parse 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3 4 5 6

std.xml pretty array literal may cause GC allocation;

operator ~ may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4 5 6

std.xml reqc 'new' causes GC allocation 1
std.xml startOf operator ~= may cause GC allocation 1 2
std.xml text 'new' causes GC allocation;

operator ~= may cause GC allocation 1 2

std.xml this 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3 4 5 6 7 8

std.xml toString operator ~ may cause GC allocation;

operator ~= may cause GC allocation 1 2 3 4 5 6 7 8 9 10

std.xml toType 'new' causes GC allocation 1
std.zip ArchiveMember.compressionMethod 'new' causes GC allocation 1
std.zip ArchiveMember.expandedData setting 'length' may cause GC allocation 1
std.zip ZipArchive.addMember indexing an associative array may cause GC allocation 1
std.zip ZipArchive.build 'new' causes GC allocation 1 2 3
std.zip ZipArchive.expand 'new' causes GC allocation 1 2 3 4
std.zip ZipArchive.this 'new' causes GC allocation;

indexing an associative array may cause GC allocation 1 2 3 4 5 6 7 8 9

std.zip this operator ~ may cause GC allocation 1
std.zlib Compress.compress 'delete' requires GC;

'new' causes GC allocation; operator ~ may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4

std.zlib Compress.error 'new' causes GC allocation 1
std.zlib Compress.flush 'delete' requires GC;

operator ~= may cause GC allocation 1 2 3

std.zlib UnCompress.error 'new' causes GC allocation 1
std.zlib UnCompress.flush 'delete' requires GC;

'new' causes GC allocation; operator ~ may cause GC allocation; operator ~= may cause GC allocation 1 2 3 4

std.zlib UnCompress.uncompress 'delete' requires GC;

'new' causes GC allocation; operator ~ may cause GC allocation; setting 'length' may cause GC allocation 1 2 3 4

std.zlib compress 'delete' requires GC;

'new' causes GC allocation; setting 'length' may cause GC allocation 1 2 3 4

std.zlib uncompress 'new' causes GC allocation;

setting 'length' may cause GC allocation 1 2 3 4 5