when you see in the disassembly, you would find vc calls jump to the jmp tables why the calls can be hooked.
a virtual method call in the vc disassemby code, it first jump to the jmp table and then access the virtual table.
a non-virtual method call at first jump to the jmp table and then jmp to actual text code.
when call the a virtual method directly like you do, the disassembly code skip the first jump and directly access the virtual table pointer. thus you think it beats the non-virtual method calls.
and gcc implements virtual table pointer very different from vc, it may generate branches. calling virtual method like you supposed may beats nonvirt method more much. but that is not the fact.
when you see in the disassembly, you would find vc calls jump to the jmp tables why the calls can be hooked.
a virtual method call in the vc disassemby code, it first jump to the jmp table and then access the virtual table.
a non-virtual method call at first jump to the jmp table and then jmp to actual text code.
when call the a virtual method directly like you do, the disassembly code skip the first jump and directly access the virtual table pointer. thus you think it beats the non-virtual method calls.
and gcc implements virtual table pointer very different from vc, it may generate branches. calling virtual method like you supposed may beats nonvirt method more much. but that is not the fact.