diff options
author | Aliaksey Kandratsenka <alk@tut.by> | 2015-10-03 18:47:14 -0700 |
---|---|---|
committer | Aliaksey Kandratsenka <alkondratenko@gmail.com> | 2015-10-05 21:05:43 -0700 |
commit | 72e6e35baf5cf133f168374bb42be36a81a26d6c (patch) | |
tree | 2112c491a0badcab6c84b4e8c4e009ce21703ac0 | |
parent | faea31f3f8297e4ff0106637a0717afbcda19d6b (diff) | |
download | gperftools-72e6e35baf5cf133f168374bb42be36a81a26d6c.tar.gz |
added SizeMap::MaybeSizeClass
Because it allows us to first check for smaller sizes, which is most
likely.
-rw-r--r-- | src/common.h | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/common.h b/src/common.h index c3484d3..e8a1ba6 100644 --- a/src/common.h +++ b/src/common.h @@ -194,15 +194,23 @@ class SizeMap { ((kMaxSize + 127 + (120 << 7)) >> 7) + 1; unsigned char class_array_[kClassArraySize]; + static inline size_t SmallSizeClass(size_t s) { + return (static_cast<uint32_t>(s) + 7) >> 3; + } + + static inline size_t LargeSizeClass(size_t s) { + return (static_cast<uint32_t>(s) + 127 + (120 << 7)) >> 7; + } + // Compute index of the class_array[] entry for a given size - static inline size_t ClassIndex(int s) { + static inline size_t ClassIndex(size_t s) { // Use unsigned arithmetic to avoid unnecessary sign extensions. ASSERT(0 <= s); ASSERT(s <= kMaxSize); if (LIKELY(s <= kMaxSmallSize)) { - return (static_cast<uint32_t>(s) + 7) >> 3; + return SmallSizeClass(s); } else { - return (static_cast<uint32_t>(s) + 127 + (120 << 7)) >> 7; + return LargeSizeClass(s); } } @@ -222,10 +230,23 @@ class SizeMap { // Initialize the mapping arrays void Init(); - inline int SizeClass(int size) { + inline int SizeClass(size_t size) { return class_array_[ClassIndex(size)]; } + inline bool MaybeSizeClass(size_t size, size_t *size_class) { + size_t class_idx; + if (LIKELY(size <= kMaxSmallSize)) { + class_idx = SmallSizeClass(size); + } else if (size <= kMaxSize) { + class_idx = LargeSizeClass(size); + } else { + return false; + } + *size_class = class_array_[class_idx]; + return true; + } + // Get the byte-size for a specified class inline size_t ByteSizeForClass(size_t cl) { return class_to_size_[cl]; |