Date: prev next · Thread: first prev next last
2019 Archives by date, by thread · List index


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.