Commit 94c2536e authored by Russ Cox's avatar Russ Cox

runtime: avoid allocation for make([]T, 0)

R=gri, iant, iant
CC=golang-dev
https://golang.org/cl/5375093
parent 276473cd
...@@ -32,6 +32,11 @@ runtime·makeslice(SliceType *t, int64 len, int64 cap, Slice ret) ...@@ -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 static void
makeslice1(SliceType *t, int32 len, int32 cap, Slice *ret) makeslice1(SliceType *t, int32 len, int32 cap, Slice *ret)
{ {
...@@ -42,7 +47,9 @@ 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->len = len;
ret->cap = cap; 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); ret->array = runtime·mallocgc(size, FlagNoPointers, 1, 1);
else else
ret->array = runtime·mal(size); ret->array = runtime·mal(size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment