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" <destructiona...@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?


Reply via email to