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@collabora.com
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.