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