Ranges require GC?
Frustrated
c1514843 at drdrb.com
Tue Dec 10 23:20:19 PST 2013
On Wednesday, 11 December 2013 at 02:37:32 UTC, Jonathan M Davis
wrote:
> On Wednesday, December 11, 2013 03:09:52 Frustrated wrote:
>> But surely memory gets allocated in some way?
>>
>> In Programming in D:
>>
>> "For example filter(), which
>> chooses elements that are greater than 10 in the following
>> code,
>> actually returns a range
>> object, not an array:"
>>
>> But if filter is a range and returns an object then how is that
>> object allocated?
>
> It's on the stack. filter returns a struct whose only member is
> the range that
> was passed to it. The lambda that you pass to filter might be
> allocated on the
> heap under some circumstances, but that's the only risk of heap
> allocation
> with filter, and if you use a function rather than a lambda
> literal or a
> delegate, then you definitely don't get any heap allocation
> (and I don't think
> that it's even the case that you necessarily get a heap
> allocation with a
> lambda).
>
> Most ranges in Phobos are very lightweight, because they just
> wrap another
> range and maybe add a member variable or two to handle what
> they do (and many
> don't even need that). And if the optimizer does a decent job,
> then most of
> the wrappers even get optimized away, causing very little
> overhead at all
> (though I'm sure that dmd can be improved in that regard).
>
> Whether any particular range allocates anything on the heap
> depends on the
> range, but it's likely to be very rare that they will -
> particularly in
> Phobos.
>
> - Jonathan M Davis
I'm trying to avoid the GC so knowing whether or not ranges will
use the heap is extremely important. I guess that is where the
@nogc attribute that everyone talks about would come in very
handy.
More information about the Digitalmars-d-learn
mailing list