[libstdc++ PATCH/RFC] Aggressive space optimization for std::vector
Doug Gregor
dgregor@apple.com
Mon Jul 28 22:07:00 GMT 2003
On Monday, July 28, 2003, at 1:13PM, Gabriel Dos Reis wrote:
> Doug Gregor <dgregor@apple.com> writes:
>
> | There is more that can be done on the micro-optimization level, such
> | as eliminating some of the extra overhead in _Vector_impl (e.g., its
> | iterators can just be pointers, because they will never be exposed to
> | the user). However, I'd like to know if this type of optimization is
> | desired in libstdc++. It uglifies the source a bit, but it can be a
> | boon to users.
>
> I guess this space optimization may have some impact on code
> efficiency (optimization for something else than space). Did you make
> any measurements? I'm worried because GCC currently tends not to
> inline even simple accessor -- see past report by Benjamin.
It could have some impact on code efficiency (the deeper call graph and
replacement of fundamental types with class types are two potential
problems), but I haven't measured this. As I mentioned previously, the
patch does introduce code size regressions (albeit small ones) in the
no-reuse case, so we are likely losing a little performance here. I'll
look to see if I can stamp out those regressions, perhaps by moving
away from _Basic_pod.
> Try to
> compile with -Winline.
No difference.
> It would be nice if this code was rather controlled by -Os.
It's an ABI-breaker, so we can't do that.
> Also, I suppose this
>
> !
> ! // Primary template has maximum alignment
> ! template<std::size_t _Alignment>
> ! struct _Type_with_alignment
> ! { struct __attribute__((__aligned__)) _M_type {}; };
> !
> ! #define _GLIBCXX_TYPE_WITH_ALIGNMENT(_Align) \
> ! template<> \
> ! struct _Type_with_alignment<_Align> \
> ! { struct __attribute__((__aligned__(_Align))) _M_type {}; }
>
> is for getting around the bug in how attributes are handled (I filled
> a bug report on that a while ago), i.e. attributes don't respect usual
> name lookup rules. Please add a note to that effect.
I'd really like:
template<std::size_t _Alignment>
struct __attribute__((__aligned(_Alignment))) _Type_with_alignment
{};
... but I've just added a note instead.
> Also, I would rather see
>
> ! template<std::size_t _Size, std::size_t _Alignment>
> ! struct __type_traits<std::_Basic_pod<_Size, _Alignment> >
> ! {
> ! typedef __true_type has_trivial_default_constructor;
> ! typedef __true_type has_trivial_copy_constructor;
> ! typedef __true_type has_trivial_assignment_operator;
> ! typedef __true_type has_trivial_destructor;
> ! typedef __true_type is_POD_type;
> ! };
>
> in the file where the original __type_traits<> is defined.
Ok.
> In the
> long run, we should move away from the type based __true_type usage
> toward integral constant usage.
We should move to the TR type traits proposal, I think.
Doug
More information about the Gcc-patches
mailing list