From 94c2536e3f286f06dc7d8acfdbccac115a15437a Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 15 Nov 2011 12:05:25 -0500 Subject: [PATCH] runtime: avoid allocation for make([]T, 0) R=gri, iant, iant CC=golang-dev https://golang.org/cl/5375093 --- src/pkg/runtime/slice.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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); -- 2.50.0