Boost logo

Boost Users :

From: Scott McMurray (me22.ca+boost_at_[hidden])
Date: 2007-11-28 19:54:45


On 28/11/2007, Bryan Green <bgreen_at_[hidden]> wrote:
> 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.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net