Stuff in Phobos That Generates Garbage
Contents
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; | |
std.array | Appender.this | 'new' causes GC allocation; | |
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; | |
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; | |
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; | |
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; | |
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; | |
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; | |
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; | |
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; | |
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; | |
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; | |
std.internal.math.biguintcore | BigUint.mod | 'new' causes GC allocation; | |
std.internal.math.biguintcore | BigUint.modInt | 'delete' requires GC; | |
std.internal.math.biguintcore | BigUint.mul | 'new' causes GC allocation; | |
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; | |
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; | |
std.internal.math.biguintcore | divModInternal | 'delete' requires GC; | |
std.internal.math.biguintcore | includeSign | 'new' causes GC allocation 1 | |
std.internal.math.biguintcore | mulInternal | 'delete' requires GC; | |
std.internal.math.biguintcore | squareInternal | 'delete' requires GC; | |
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; | |
std.process | escapeShellCommand | operator ~ may cause GC allocation; | |
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; | |
std.process | newFromLastError | 'new' causes GC allocation; | |
std.process | pipe | 'new' causes GC allocation; | |
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; | |
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; | |
std.range | roundRobin.Result.popFront.makeSwitchIncrementCounter | operator ~ may cause GC allocation; | |
std.range | roundRobin.Result.popFront.makeSwitchPopFront | operator ~ may cause GC allocation; | |
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; | |
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; | |
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; | |
std.socket | Address.toServiceString | 'new' causes GC allocation; | |
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; | |
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; | |
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; | |
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; | |
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; | |
std.stream | Stream.readExact | 'new' causes GC allocation 1 | |
std.stream | Stream.readLine | operator ~= may cause GC allocation; | |
std.stream | Stream.readLineW | operator ~= may cause GC allocation; | |
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; | |
std.stream | Stream.ungetc | operator ~= may cause GC allocation; | |
std.stream | Stream.ungetcw | operator ~= may cause GC allocation; | |
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; | |
std.stream | open | 'new' causes GC allocation; | |
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; | 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; | |
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; | |
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; | |
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; | |
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; | |
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; | 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; | |
std.xml | checkLiteral | operator ~ may cause GC allocation 1 | |
std.xml | decode | 'new' causes GC allocation; | |
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; | |
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; | |
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; | |
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; |