On 13/11/18 22:59 +0000, Jonathan Wakely wrote:
        * src/c++17/memory_resource.cc (bitset::find_first_unset()): Remove
        unused function.
        (bitset::get_first_unset()): Remove loop, if there's are unset bits
        then _M_next_word refers to the first one and there's no need to loop.
        (_Pool::_Pool(size_t, size_t), _Pool::block_size()): Remove dead code.


    size_type get_first_unset() noexcept
    {
-      for (size_type i = _M_next_word; i < nwords(); ++i)
+      if (_M_next_word < nwords())
        {
-         const size_type n = std::__countr_one(_M_words[i]);
+         const size_type n = std::__countr_one(_M_words[_M_next_word]);
          if (n < bits_per_word)
            {
              const word bit = word(1) << n;
-             _M_words[i] |= bit;
-             if (i == _M_next_word)
+             _M_words[_M_next_word] |= bit;
+             const size_t res = (_M_next_word * bits_per_word) + n;
+             if (n == (bits_per_word - 1))
                update_next_word();
-             return (i * bits_per_word) + n;
+             return res;
            }
        }
      return size_type(-1);

I'm not sure why, but this version seems to perform measurably worse.
I'll investigate, and maybe revert the change.


Reply via email to