Boost logo

Boost :

From: Howard Hinnant (hinnant_at_[hidden])
Date: 2008-06-24 12:25:40


On Jun 24, 2008, at 12:20 PM, Niels Dekker - mail address until
2008-12-31 wrote:

> David Abrahams wrote:
>> I haven't formed an opinion yet, but the fact remains that swapping a
>> boost::array would have very different efficiency characteristics
>> from
>> swapping the analogous std::vector, so we ought to think it through
>> carefully.
>
> Howard Hinnant wrote:
>> If it helps, here is a test program using gcc 4.0.1:
> ...
>> template <class T, std::size_t N>
>> void
>> swap1(std::tr1::array<T, N>& a, std::tr1::array<T, N>& b)
>> {
>> std::tr1::array<T, N> temp(a);
>> a = b;
>> b = temp;
>> }
>>
>> template <class T, std::size_t N>
>> void
>> swap2(std::tr1::array<T, N>& a, std::tr1::array<T, N>& b)
>> {
>> std::swap_ranges(a.begin(), a.end(), b.begin());
>> }
> ...
>> On my machine:
>>
>> $ g++ -O3 test.cpp
>> $ ./a.out
>> swap1 time is 0.172796 seconds
>> swap2 time is 1.3e-05 seconds
>
> Cool! Thanks, Howard. The swap member function of boost::array also
> calls std::swap_ranges, like your swap2:
>
> // swap (note: linear complexity)
> void swap (array<T,N>& y) {
> std::swap_ranges(begin(),end(),y.begin());
> }
>
> Unfortunately std::swap_ranges doesn't always pick the custom swap
> function of T. At least, the STL implementation that comes with MSVC
> 2008 has swap_ranges calling std::iter_swap, which calls std::swap,
> without doing argument-dependent lookup. :-( Luckily, once
> boost::swap would be in the trunk, boost::array::swap could be
> implemented simply by swapping its one and only data member, elems
> (a built-in array of T):
>
> void swap (array<T,N>& y) {
> // Assuming that boost::swap supports built-in arrays:
> boost::swap(this->elems, y.elems);
> }
>
> Having boost::array::swap call boost::swap would have two
> advantages: it would support a boost::array containing built-in
> arrays as elements (boost::array<T[M],N>), and it would use ADL to
> pick the custom swap function of T.
>
> What do you think?

That sounds like a good solution for the boost lib. Fwiw, I am trying
to ensure that std::iter_swap does nothing but call swap (unqualified)
in C++0X.

-Howard


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk