https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96577

            Bug ID: 96577
           Summary: template binary bloat of two std::sort as an example.
                    It looks like colonization is doing the wrong thing
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: euloanty at live dot com
  Target Milestone: ---

https://godbolt.org/z/haG4E7
https://godbolt.org/z/M8e7Kb

First:

#include<vector>
#include<array>
#include<algorithm>

template<std::contiguous_iterator Iter>
void f(Iter a,Iter b)
{
    std::sort(a,b);
}

void g(std::vector<int>::iterator b,std::vector<int>::iterator e)
{
    f(b,e);
}

void h(int* b,int* e)
{
    f(b,e);
}

Second:


#include<vector>
#include<array>
#include<algorithm>

template<std::contiguous_iterator Iter>
void f(Iter a,Iter b)
{
    std::sort(a,b);
}

void g(std::vector<int>::iterator b,std::vector<int>::iterator e)
{
    f(std::to_address(b),std::to_address(e));
}

void h(int* b,int* e)
{
    f(b,e);
}


The two sort function should generate exactly the same binary. However the
first which is none to_address version generates twice as much as code as the
second one.

BTW, inline function is not ABI stable, there is no reason not to collapse that
abstraction

Reply via email to