• kornel
    link
    fedilink
    arrow-up
    6
    ·
    edit-2
    1 year ago

    I don’t know about C++, but in Rust the push is inline, and still doesn’t always optimize checks away due to an annoying edge case: integer overflow. Reserving (old_len + new_len) could give you a smaller buffer than new_len. The optimizer sees it and is pedantic about it.

    • robinm
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      In C++ integer overflow is UB so this edge case cannot exist

      • kornel
        link
        fedilink
        arrow-up
        3
        ·
        1 year ago

        Only signed overflow. size_t is unsigned.

        • robinm
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          1 year ago

          That’s totally right but I thought you were talking about signed numbers since you said “integer overflow”. I forgot that len is usually unsigned in C++.