Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>What's amusing with this question is that it's just so compiler dependent. Using Clang/LLVM:</p> <pre><code>#include &lt;iostream&gt; using namespace std; inline int foo(int a) { return a &lt;&lt; 1; } struct Bar { int a; Bar(int x) : a(x) {} Bar baz() { return a &lt;&lt; 1; } }; void out(int x) __attribute__ ((noinline)); void out(int x) { cout &lt;&lt; x; } void out(Bar x) __attribute__ ((noinline)); void out(Bar x) { cout &lt;&lt; x.a; } void f1(int x) __attribute ((noinline)); void f1(int x) { out(foo(x)); } void f2(Bar b) __attribute ((noinline)); void f2(Bar b) { out(b.baz()); } int main(int argc, char** argv) { f1(argc); f2(argc); } </code></pre> <p>Gives <a href="http://llvm.org/demo/index.cgi" rel="nofollow">the following IR</a>:</p> <pre><code>define void @_Z3outi(i32 %x) uwtable noinline { %1 = tail call %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* @_ZSt4cout, i32 %x) ret void } define void @_Z3out3Bar(i32 %x.coerce) uwtable noinline { %1 = tail call %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_ostream"* @_ZSt4cout, i32 %x.coerce) ret void } define void @_Z2f1i(i32 %x) uwtable noinline { %1 = shl i32 %x, 1 tail call void @_Z3outi(i32 %1) ret void } define void @_Z2f23Bar(i32 %b.coerce) uwtable noinline { %1 = shl i32 %b.coerce, 1 tail call void @_Z3out3Bar(i32 %1) ret void } </code></pre> <p>And unsurprisingly, the generated assembly is just identical:</p> <pre><code> .globl _Z2f1i .align 16, 0x90 .type _Z2f1i,@function _Z2f1i: # @_Z2f1i .Ltmp6: .cfi_startproc # BB#0: addl %edi, %edi jmp _Z3outi # TAILCALL .Ltmp7: .size _Z2f1i, .Ltmp7-_Z2f1i .Ltmp8: .cfi_endproc .Leh_func_end2: .globl _Z2f23Bar .align 16, 0x90 .type _Z2f23Bar,@function _Z2f23Bar: # @_Z2f23Bar .Ltmp9: .cfi_startproc # BB#0: addl %edi, %edi jmp _Z3out3Bar # TAILCALL .Ltmp10: .size _Z2f23Bar, .Ltmp10-_Z2f23Bar .Ltmp11: .cfi_endproc .Leh_func_end3: </code></pre> <p>Normally, as long as the methods on the class are inlined, the <code>this</code> parameter and references can be omitted easily. I don't quite see how gcc could mess this up.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload