> On Apr 29, 2015, at 7:45 AM, Avi Kivity <[email protected]> wrote:
> As per the Itanium ABI gcc mangles the return types of function templates, so
> that we can see mangled names like
>
> _Z1hIiEDTplcl1fIT_EEcl1gIS0_EEEv
>
> which demangle to
>
> decltype (((f<int>)())+((g<int>)())) h<int>()
>
> In seastar [1] this causes serious compile-time performance problems.
> Replacing complicated template argument dependent return types improves
> compile time and object size by around 10%.
>
> What is the reason that the ABI mandates mangling the return type into the
> function name?
The ABI only calls for this for function templates, where it is required
because function templates with different dependent signatures are distinct
templates; q.v. [temp.over.link].
John.
>
>
>
> The patch below (replacing return types with auto) gave me about 10% compile
> time improvement:
>
> --- a/core/future.hh
> +++ b/core/future.hh
> @@ -460,7 +460,8 @@ private:
> }
> template <typename Ret, typename Func, typename Param>
> - futurize_t<Ret> then(Func&& func, Param&& param) noexcept {
> + auto // futurize_t<Ret>
> + then(Func&& func, Param&& param) noexcept {
> using futurator = futurize<Ret>;
> using P = typename futurator::promise_type;
> if (state()->available() && (++future_avail_count % 256)) {
> @@ -526,12 +527,14 @@ public:
> }
> template <typename Func>
> - futurize_t<std::result_of_t<Func(T&&...)>> then(Func&& func) noexcept {
> + auto // futurize_t<std::result_of_t<Func(T&&...)>>
> + then(Func&& func) noexcept {
> return
> then<std::result_of_t<Func(T&&...)>>(std::forward<Func>(func), []
> (future_state<T...>&& state) { return state.get(); });
> }
> template <typename Func>
> - futurize_t<std::result_of_t<Func(future<T...>)>>
> + auto
> + //futurize_t<std::result_of_t<Func(future<T...>)>>
> then_wrapped(Func&& func) noexcept {
> return
> then<std::result_of_t<Func(future<T...>)>>(std::forward<Func>(func), []
> (future_state<T...>&& state) { return future(std::move(state)); });
> }
>
>
>
>
> [1] https://github.com/cloudius-systems/seastar, specifically future::then()
> in core/future.hh
> _______________________________________________
> cxx-abi-dev mailing list
> [email protected]
> http://sourcerytools.com/cgi-bin/mailman/listinfo/cxx-abi-dev
_______________________________________________
cxx-abi-dev mailing list
[email protected]
http://sourcerytools.com/cgi-bin/mailman/listinfo/cxx-abi-dev