Using closure causes GC allocation

Moritz Maxeiner via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Sep 2 13:10:58 PDT 2017


On Saturday, 2 September 2017 at 18:59:30 UTC, Vino.B wrote:
> On Saturday, 2 September 2017 at 18:32:55 UTC, Moritz Maxeiner 
> wrote:
>> On Saturday, 2 September 2017 at 18:08:19 UTC, vino.b wrote:
>>> On Saturday, 2 September 2017 at 18:02:06 UTC, Moritz 
>>> Maxeiner wrote:
>>>> On Saturday, 2 September 2017 at 17:43:08 UTC, Vino.B wrote:
>>>>> [...]
>>>>
>>>> Line 25 happens because of `[a.name]`. You request a new 
>>>> array: the memory for this has to be allocated (the reason 
>>>> why the compiler says "may" is because sometimes, e.g. if 
>>>> the array literal itself contains only literals, the 
>>>> allocations needn't happen at runtime and no GC call is 
>>>> necessary). Since you don't actually use the array, get rid 
>>>> of it:
>>>>
>>>> [...]
>>>
>>> Hi,
>>>
>>>   Thank you for your help and the DMD version that i am using 
>>> is DMD 2.076.0 and yes I am on windows.
>>
>> Please post a compilable, minimal example including how that 
>> function gets called that yields you that compiler output.
>
> Hi,
>
>  Please find the example code below,
>
> [...]

Cannot reproduce under Linux with dmd 2.076.0 (with commented out 
Windows-only check). I'll try to see what happens on Windows once 
I have a VM setup.

>
> Another similar issue :
>  I removed the [a.name] and the issue in line 25 has resolved, 
> but for another function i am getting the same error
>
> string[][] cleanFiles(string FFs, string Step) {
> 	auto dFiles = dirEntries(FFs, SpanMode.shallow).filter!(a => 
> a.isFile).map!(a =>[a.name , a.timeCreated.toSimpleString[0 .. 
> 20]]).array;  -> Issue in this line
>     if (Step == "run")
>         dFiles.each!(a => a[0].remove);
> 		return dFiles;
> }
>
> if the replace the line in error as below then i am getting the 
> error "Error: cannot implicitly convert expression dFiles of 
> type Tuple!(string, string)[] to string[][]"
>
> auto dFiles = dirEntries(FFs, SpanMode.shallow).filter!(a => 
> a.isFile).map!(a => tuple(a.name, 
> a.timeCreated.toSimpleString[0 .. 20])).array;

You changed the type of dFiles, which you return from cleanFiles, 
without changing the return type of cleanFiles. Change the return 
type of cleanFiles to the type the compiler error above tells you 
it should be (`Tuple!(string, string)[]` instead of 
`string[][]`), or let the compiler infer it via auto (`auto 
cleanFiles(...`).


More information about the Digitalmars-d-learn mailing list