| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Malloc small size classes. |
| // |
| // See malloc.go for overview. |
| // See also mksizeclasses.go for how we decide what size classes to use. |
| |
| package runtime |
| |
| // sizeToClass(0 <= n <= MaxSmallSize) returns the size class, |
| // 1 <= sizeclass < NumSizeClasses, for n. |
| // Size class 0 is reserved to mean "not small". |
| // |
| // The sizeToClass lookup is implemented using two arrays, |
| // one mapping sizes <= 1024 to their class and one mapping |
| // sizes >= 1024 and <= MaxSmallSize to their class. |
| // All objects are 8-aligned, so the first array is indexed by |
| // the size divided by 8 (rounded up). Objects >= 1024 bytes |
| // are 128-aligned, so the second array is indexed by the |
| // size divided by 128 (rounded up). The arrays are constants |
| // in sizeclass.go generated by mksizeclass.go. |
| func sizeToClass(size uint32) uint32 { |
| if size > _MaxSmallSize { |
| throw("invalid size") |
| } |
| if size > smallSizeMax-8 { |
| return uint32(size_to_class128[(size-smallSizeMax+largeSizeDiv-1)/largeSizeDiv]) |
| } |
| return uint32(size_to_class8[(size+smallSizeDiv-1)/smallSizeDiv]) |
| } |
| |
| // Returns size of the memory block that mallocgc will allocate if you ask for the size. |
| func roundupsize(size uintptr) uintptr { |
| if size < _MaxSmallSize { |
| if size <= smallSizeMax-8 { |
| return uintptr(class_to_size[size_to_class8[(size+smallSizeDiv-1)/smallSizeDiv]]) |
| } else { |
| return uintptr(class_to_size[size_to_class128[(size-smallSizeMax+largeSizeDiv-1)/largeSizeDiv]]) |
| } |
| } |
| if size+_PageSize < size { |
| return size |
| } |
| return round(size, _PageSize) |
| } |