C++ virtual function
How C++ virtual function is implemented? Compilers have their own
implementations. I am interested to see the implementation of gcc.
$ gcc --version
gcc (Debian 4.7.2-5) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
This is a simple example.
class B {
public:
    virtual int foo1() = 0;
    virtual int foo2() = 0;
    virtual int foo3() = 0;
};
int bar(B * obj)
{
    return obj->foo3();
}
Here is the output of the assemble code.
$ gcc -O3 -S -c -o - vf.cc
        .file   "vf.cc"
        .text
        .p2align 4,,15
        .globl  _Z3barP1B
        .type   _Z3barP1B, @function
_Z3barP1B:
.LFB0:
        .cfi_startproc
        movq    (%rdi), %rax
        movq    16(%rax), %rax
        jmp     *%rax
        .cfi_endproc
.LFE0:
        .size   _Z3barP1B, .-_Z3barP1B
        .ident  "GCC: (Debian 4.7.2-5) 4.7.2"
        .section        .note.GNU-stack,"",@progbits
The interesting part is
        movq    (%rdi), %rax
        movq    16(%rax), %rax
        jmp     *%rax
We know %rdi is the first function argument, and it is this
pointer. I guess the very first 8 bytes it is pointed to are the
pointer of vtable, so firstly, we load the vtable into
%rax. gcc knows that foo3 is the third virtual function, so that
the offset of foo3 is 16, and we load the virtual function pointer
foo3 into %rax. Finally, jumping to the virtual function.