From: Russ Cox Date: Tue, 15 Nov 2011 17:05:25 +0000 (-0500) Subject: runtime: avoid allocation for make([]T, 0) X-Git-Tag: weekly.2011-11-18~52 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=94c2536e3f286f06dc7d8acfdbccac115a15437a;p=gostls13.git runtime: avoid allocation for make([]T, 0) R=gri, iant, iant CC=golang-dev https://golang.org/cl/5375093 --- diff --git a/src/pkg/runtime/slice.c b/src/pkg/runtime/slice.c index 20edf24d94..2fe4c6da47 100644 --- a/src/pkg/runtime/slice.c +++ b/src/pkg/runtime/slice.c @@ -32,6 +32,11 @@ runtime·makeslice(SliceType *t, int64 len, int64 cap, Slice ret) } } +// Dummy word to use as base pointer for make([]T, 0). +// Since you cannot take the address of such a slice, +// you can't tell that they all have the same base pointer. +static uintptr zerobase; + static void makeslice1(SliceType *t, int32 len, int32 cap, Slice *ret) { @@ -42,7 +47,9 @@ makeslice1(SliceType *t, int32 len, int32 cap, Slice *ret) ret->len = len; ret->cap = cap; - if((t->elem->kind&KindNoPointers)) + if(cap == 0) + ret->array = (byte*)&zerobase; + else if((t->elem->kind&KindNoPointers)) ret->array = runtime·mallocgc(size, FlagNoPointers, 1, 1); else ret->array = runtime·mal(size);