On 2013-11-02 23:31, Paolo Carlini wrote:
In general we are very careful with code bloat, but free functions which just forward to other functions should be definiyely inline, otherwise typically at widely used optimization levels like -O2 users get suboptimal performance for no reason. But please feel free to experiment and report your findings on the mailing list! Paolo
After review, the free functions that only ever forward to something else and are not implicitly inline appear to be that __constexpr_addressof overload and non-member swap. Here's a patch (against master) that marks them inline, all tests pass. I briefly and casually attempted to notice any effect, but to be honest in my smallish testcases GCC appeared to already see through everything.
>From 0175e61f3295159fe7ac2fefec05b829ecd6bc4d Mon Sep 17 00:00:00 2001 From: Michael Brune <lucdan...@free.fr> Date: Sun, 3 Nov 2013 01:37:16 +0100 Subject: [PATCH] Marked some forwarding free functions as inline that weren't already. --- libstdc++-v3/include/experimental/optional | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/experimental/optional b/libstdc++-v3/include/experimental/optional index 5915892..06e0f29 100644 --- a/libstdc++-v3/include/experimental/optional +++ b/libstdc++-v3/include/experimental/optional @@ -157,7 +157,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ template<typename _Tp, typename enable_if<_Has_addressof<_Tp>::value, int>::type...> - _Tp* __constexpr_addressof(_Tp& __t) + inline _Tp* __constexpr_addressof(_Tp& __t) { return std::__addressof(__t); } /** @@ -790,7 +790,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // [X.Y.11] template<typename _Tp> - void + inline void swap(optional<_Tp>& __lhs, optional<_Tp>& __rhs) noexcept(noexcept(__lhs.swap(__rhs))) { __lhs.swap(__rhs); } -- 1.8.1.2