<div dir="ltr"><div><div><div><div><div><div><div><div>It would be good to have an example of code where this is actually affecting things. In general, clang (or rather LLVM) is good at "unreferencing" references that don't need to be references when inlining, but of course, there are probably some cases where this does not hold true.<br><br></div>[I expect that the reason for things like `const int& std::min(const int &a, const int& b)` is because the function is actualy declared as "template<typename T> const T& std::min(const T& a, const T& b)`, rather than as an `int` function directly.<br><br></div>I certainly would expect something like:<br><br></div>int main()<br>{<br></div>    int a, b;<br></div>    std::cin >> a >> b;<br></div>    std::cout << std::min(a, b) << std::endl;<br>}<br><br></div>to produce identical code whether std::min(int a, int b) or the const reference variant. But of course, with more complex constructs, the compiler may not realize what is going on and be able to remove the references. Making the compiler  smarter in those cases is always an option... <br><br>--<br></div>Mats<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 11 January 2017 at 09:49, Francois Fayard via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
Because of the emphasis on generic programming, the C++ standard library has many weird signatures such as:<br>
<br>
const int& std::min(const int& a, const int& b) (1)<br>
<br>
where one would expect a:<br>
<br>
int std::min(int a, int b) (2)<br>
<br>
I thought that this would not matter from a performance point of view as those functions are inlined anyway. And it turns out that when you replace a signature such as (2) into (1) where the function is inlined, the assembly does not change at the call site: both are inlined properly.<br>
<br>
But I came to realize that some side effects are cascaded to other parts of the code, and codes that use (1) end up being slower than code using (2), wether the compiler is clang, gcc or intel compiler (even though the loss of performance differs from compiler to compiler).<br>
<br>
Is there any fundamental reason for this? Would you recommend avoiding signatures such as (1) which end up being used a lot when min is template-defined?<br>
<br>
Best regards,<br>
Francois<br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div>