Ranges require GC?

Frustrated c1514843 at drdrb.com
Tue Dec 10 18:09:52 PST 2013


On Tuesday, 10 December 2013 at 21:20:59 UTC, Marco Leise wrote:
> Am Tue, 10 Dec 2013 19:55:20 +0100
> schrieb "Adam D. Ruppe" <destructionator at gmail.com>:
>
>> On Tuesday, 10 December 2013 at 18:54:54 UTC, Frustrated wrote:
>> > I assume that ranges require the GC, is this true?
>> 
>> No, in fact, most ranges don't allocate at all.
>
> "range" is just a concept and not a concrete type.
> Functions that work on ranges identify them by specific calls
> that can be made on them. (e.g. front, popFront(), length,
> etc.). This is commonly known as duck-typing. And allows much
> anything to be a range: Classes, structs, built-in arrays.
>
> D objects and dynamic arrays are typically GC managed. Most
> ranges returned from Phobos are implemented as structs though
> and don't need a GC. If you write something like:
>
>   [1,2,3].map!(a => a+1)()
>
> then you are using a dynamic array ([1,2,3]) that will live in
> the GC heap. "map" will then just return a range (implemented
> as a struct). One has to understand that no memory will be
> allocated to hold the result of the map process. In fact where
> possible, Phobos returns lazily evaluated ranges that only
> calculate the next item when you ask for it (using .front
> and .popFront() on it).

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?




More information about the Digitalmars-d-learn mailing list