• lysdexic@programming.devOPM
      link
      fedilink
      English
      arrow-up
      5
      ·
      8 months ago

      Why no mention of std::array?

      I think this was focused on maintaining code. Replacing C-style arrays with std::array can be a daunting task, depending on how the project is structured.

      • eveninghere@beehaw.org
        link
        fedilink
        arrow-up
        2
        arrow-down
        1
        ·
        edit-2
        8 months ago

        I don’t really see how it’s daunting enough to avoid mentioning. You can replace a C array on the stack by just swapping it with std::array. Yes, it can depend on the project structure, but that’s equivalently true for any STL container the author recommended.

        • lysdexic@programming.devOPM
          link
          fedilink
          English
          arrow-up
          3
          ·
          8 months ago

          I don’t really see how it’s daunting enough to avoid mentioning.

          I think it’s a good call not to mention them because they are irrelevant given the topic. If your code base and/or the consumers of your code base are using C-style arrays for input and/or output, it’s hardly helpful to suggest changing all your interfaces to use another data type. It’s outright impossible if you’re dealing with extern C interfaces.

          • addie
            link
            fedilink
            arrow-up
            2
            ·
            8 months ago

            Depending on what OP is trying to do; swapping out the internal implementation with array and then decaying to the old terrible .data() ‘pointer that could be anything’ when having to cross interfaces and boundaries could be a winner. At least their own stuff gets the benefits of known size, bounds checking and being a real class, and the code improvements can be done a little at a time. I’d almost consider this the main use case for array - unless for some reason you just absolutely must allocate on the stack, then vector is better in every way.

            Same argument for smart pointers. If some legacy code returns an owning pointer, then get it wrapped up as soon as possible. At least your own code won’t leak.

  • WolfLink@lemmy.ml
    link
    fedilink
    arrow-up
    5
    arrow-down
    1
    ·
    8 months ago

    Tbh if you aren’t already using someone else’s array implementation that includes length information, just write your own simple wrapper e.g.

    struct MyArrayWrapper { int *data; int length; }

    • clyne@discuss.tchncs.de
      link
      fedilink
      arrow-up
      2
      ·
      8 months ago

      At that point I would just use std::span if you can, then you also get the standard container/iterator interfaces for free.

    • xep@fedia.io
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      8 months ago

      The article did mention that that’s what you’d probably have to do.

      I have only one pointer (for example, if you created an array using new)

      In most cases, it’s necessary to rewrite the program a bit and add an array size passing. Sadly, that’s how it works.