提交 73eaacd0 创建 作者: Austin Clements's avatar Austin Clements

radix: Let the compiler inline and deduplicate radix{_range}.end()

This puts the trivial part of the radix_iterator constructor used by end() in the class definition, so the compiler can see the full definition of end(). This should let it inline it and, hopefully, constant-eliminate it so it doesn't get called repeatedly.
上级 53ec8ed9
...@@ -234,7 +234,12 @@ struct radix_iterator { ...@@ -234,7 +234,12 @@ struct radix_iterator {
// The level of the current element. // The level of the current element.
u32 level_; u32 level_;
radix_iterator(const radix* r, u64 k, u64 limit); radix_iterator(const radix* r, u64 k, u64 limit)
: r_(r), k_(k), key_limit_(limit)
{
if (k_ != key_limit_)
prime_path();
}
radix_iterator &operator++() { radix_iterator &operator++() {
assert(k_ < key_limit_); assert(k_ < key_limit_);
...@@ -252,6 +257,8 @@ struct radix_iterator { ...@@ -252,6 +257,8 @@ struct radix_iterator {
return r_ != other.r_ || k_ != other.k_; } return r_ != other.r_ || k_ != other.k_; }
private: private:
// Prepare the initial path_ and level_ based on k_.
void prime_path();
// Advance to the next non-null leaf. This assumes that // Advance to the next non-null leaf. This assumes that
// k_ < key_limit_. // k_ < key_limit_.
void advance(); void advance();
......
...@@ -246,11 +246,10 @@ radix_range::replace(u64 start, u64 size, radix_elem *val) ...@@ -246,11 +246,10 @@ radix_range::replace(u64 start, u64 size, radix_elem *val)
}, 0, 1L << key_bits, start, start + size); }, 0, 1L << key_bits, start, start + size);
} }
radix_iterator::radix_iterator(const radix* r, u64 k, u64 limit) void
: r_(r), k_(k), key_limit_(limit) { radix_iterator::prime_path()
{
dprintf("%p: Made iterator with k = %lx\n", r_, k_); dprintf("%p: Made iterator with k = %lx\n", r_, k_);
if (k_ == key_limit_)
return;
// Load the initial path // Load the initial path
level_ = radix_levels; level_ = radix_levels;
...@@ -261,6 +260,7 @@ radix_iterator::radix_iterator(const radix* r, u64 k, u64 limit) ...@@ -261,6 +260,7 @@ radix_iterator::radix_iterator(const radix* r, u64 k, u64 limit)
path_[level_] = &entry.node()->child[index(k_, level_)]; path_[level_] = &entry.node()->child[index(k_, level_)];
node = path_[level_]; node = path_[level_];
} }
dprintf("%p: Adjusted: k = %lx\n", r_, k_); dprintf("%p: Adjusted: k = %lx\n", r_, k_);
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论