About replacing some "C-Array" into std::array
Luboš Luňák
l.lunak at collabora.com
Fri Nov 22 16:35:00 UTC 2019
On Friday 22 of November 2019, julien2412 wrote:
> Hello,
>
> Taking a look at cppcheck report, I noticed this kind of reports:
> vcl/source/treelist/transfer.cxx
> 132 useStlAlgorithm 398 style Consider using std::fill algorithm instead of
> a raw loop
Note that it says "style". Style in itself doesn't necessarily bring anything
besides, well, style.
> To use std::fill, we'd need to convert the C array into std::array.
No, we wouldn't: std::fill( array, array + 10, value );
> Reading https://coders-corner.net/2018/06/16/stdarray-vs-c-style-array/, it
> seems there's no real cons about this.
The summary is questionable. It omits section "std::array as method parameter
with variable size", which is actually a common use case for C
arrays. "Direct support of use in STL algorithms" is probably not true, given
that STL algorithms work just fine with pointers to C array elements, as
shown above. And "No memory overhead beyond what it needs to hold its
elements" is clearly not an advantage when comparing to C arrays, because
it's the same for C arrays.
Using std::array has some advantages over C arrays, no need to inflate the
list. If the author wanted the list to be longer, I have no idea why "not
bloody confusing for new developers" was skipped.
> The idea is not only to diminish cppcheck reports but above all try to gain
> some perfs (even little but multiplied by the number of calls...) by using
> STL.
I think there wouldn't be any performance gain. Why should there be? Even the
page you linked says that one of advantages of std::array is that it has the
same performance as C array[*].
> Since we're at the beginning of 6.5, thought it could be relevant.
> The code change should be quite straight forward, so risk of regression
> should be low.
>
> Is there some kind of rule of thumb to decide between C array and
> std::array ?
Well, there are some that come to mind, such as "KISS" and "don't fix what is
not broken" :). There actually are places where C arrays may be better, such
as when the code is trivially simple, when interfacing with C libraries, or
when using STL actually makes the code worse[**].
But note that I'm not strictly opposed to this. I suppose there are places
where std::array can do better. I just think that such changes should not be
done blindly based on incorrect assumptions.
[*] The performance will be about the same only in optimized code, which the
article also forgets to mention.
[**] Which is not that hard given how clunky STL usage can be. I would
personally consider converting that transfer.cxx line to std::fill() to be a
regression in readability. If STL, then it should be std::array::fill().
--
Luboš Luňák
l.lunak at collabora.com
More information about the LibreOffice
mailing list