On 28/11/2007, Bryan Green
KSpam writes:
I've discovered a situation where using boost::array results in a 2-fold performance degradation over other array types, including C arrays, tr1::array, and a simple handwritten array class.
In your build environment, ensure that you ARE NOT defining _DEBUG, and that you ARE defining NDEBUG. These flags can make a significant difference in run-time performance.
Setting NDEBUG took care of it. Thanks. :)
While the tr1::array performs well, I was suprised to find that it pads the array, so sizeof(tr1::array<3,float>) == sizeof(tr1::array<4,float>). Is that a requirement of tr1::array?
It is very strange that you see a performance difference between tr1::array and boost::array. I think that boost::array was used as a submission for tr1::array (they are likely one and the same).
The tr1::array does not do range checking or an assert in operator[].
As for the alignment, this explains it:
from gcc tr1/array:
value_type _M_instance[_Nm ? _Nm : 1] __attribute__((__aligned__));
This is in the implementation of tr1::array, for gcc's standard C++ library, which is used by Intel C++.
I sure would like to know the rational for putting in the alignment attribute, as it changes the code in a very non-trivial way.
-bgreen
This was mentioned on the libstdc++ list: ---------- Forwarded message ---------- From: Aaron Graham Date: 23 Oct 2007 23:33 Subject: sizeof std::tr1::array To: libstdc++@gcc.gnu.org This has probably been discussed before, but I can't find any information on it. Unlike boost::array, std::tr1::array (and std::array in 4.3.x) has an attribute-alignment on its data, which means that sizeof(the_array) is always a multiple of 16, at least on all systems I'm currently using: value_type _M_instance[_Nm ? _Nm : 1] __attribute__((__aligned__)); This is rather inconvenient, and somewhat unnecessary, especially on embedded systems, since there's a nontrivial hidden cost here. I have a harder time convincing programmers not to roll-their-own when I see stuff like that. Can I get an explanation please? Thanks in advance. Aaron ---------- Forwarded message ---------- From: Paolo Carlini Date: 24 Oct 2007 06:14 Subject: Re: sizeof std::tr1::array To: Aaron Graham Cc: libstdc++@gcc.gnu.org Aaron Graham wrote:
Can I get an explanation please?
No big deal, we wanted to play safe wrt some extensions which need a large alignment. I agree we can change it back to the natural alignment and fix that other stuff... Thanks, Paolo.