On Tuesday, 8 July 2014 at 11:26:55 UTC, John Colvin wrote:
On Tuesday, 8 July 2014 at 11:22:42 UTC, John Colvin wrote:
On Tuesday, 8 July 2014 at 06:23:13 UTC, Jeremy DeHaan wrote:
I remember that slices was one thing you would no longer have
if you disable the GC, but I can't think of any others.
You can definitely use slices without the GC and they are
still awesome without the GC.
What you cannot do is create them with `new` or call the
builtin ~ or ~= (concatenate and append respectively)
operators on slices. Slice literals may also cause
allocations, but not always:
enum ctA = [3, 4];
void main() @nogc //@nogc is transitive, marking main as @nogc
//enforces no GC activity in the entire
program.
{
//these statements are all guaranteed not to GC-allocate
int[2] a = [1, 2];
assert(a[0] == 1 && a[1] == 2);
a = ctA;
assert(a[0] == 3 && a[1] == 4);
assert(a == [3,4]);
import core.stdc.stdlib;
auto data = cast(int*)calloc(100_000, int.sizeof);
auto callocedSlice = data[0 .. 100_000];
auto subSlice = callocedSlice[40 .. $ - 600];
//these cause GC allocation and as such
//will not compile in an @nogc function.
// int[] s0 = [1, 2];
// auto s1 = [3,4];
}
I should also include this example:
int[10] a = [0,1,2,3,4,5,6,7,8,9]; //a static array, on the
stack
auto s = a[]; //a normal slice, backed by stack memory*
auto s1 = a[3 .. 5]; //ditto
I see. Thanks for the examples. What about strings? Do they
depend on GC?