Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
// A.h
#ifndef _A_H_
#define _A_H_
#include <iostream>
class A
{
public:
inline void foo();
};
void A::foo()
{
std::cout << "A::foo()" << std::endl;
}
// main.cpp
#include <cstdlib>
#include <iostream>
#include "A.h"
int main()
{
A a;
a.foo();
return EXIT_SUCCESS;
}int main()
{
A a;
a.foo();00401000 mov ecx,dword ptr [__imp_stlp_std::cout (4020ACh)]
00401006 push esi
00401007 push offset string "A::foo()" (402114h)
0040100C mov esi,ecx
0040100E call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::_M_put_nowiden (4020B0h)]
00401014 push offset stlp_std::endl<char,stlp_std::char_traits<char> > (401030h)
00401019 mov ecx,esi
0040101B call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::operator<< (4020A4h)]// main.cpp
#include <cstdlib>
#include <iostream>
#include "A.h"
int main()
{
A a;
a.foo();
void (A::*pF)() = &A::foo; // берем адрес подставляемого метода
(a.*pF)(); // используем
return EXIT_SUCCESS;
}int main()
{
00401030 push ecx
A a;
a.foo();00401031 mov ecx,dword ptr [__imp_stlp_std::cout (4020ACh)]
00401037 push esi
00401038 push offset string "A::foo()" (402114h)
0040103D mov esi,ecx
0040103F call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::_M_put_nowiden (4020B0h)]
00401045 push offset stlp_std::endl<char,stlp_std::char_traits<char> > (401060h)
0040104A mov ecx,esi
0040104C call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::operator<< (4020A4h)]void (A::*pF)() = &A::foo;
(a.*pF)();00401052 lea ecx,[esp+7]
00401056 call A::foo (401000h)void A::foo()
{
std::cout << "A::foo()" << std::endl;00401000 mov ecx,dword ptr [__imp_stlp_std::cout (4020ACh)]
00401006 push esi
00401007 push offset string "A::foo()" (402114h)
0040100C mov esi,ecx
0040100E call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::_M_put_nowiden (4020B0h)]
00401014 push offset stlp_std::endl<char,stlp_std::char_traits<char> > (401060h)
00401019 mov ecx,esi
0040101B call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::operator<< (4020A4h)]
00401021 pop esi}Им что, лень добавить лишний проход компилятора, лучше пусть программист мучается?
Подставляемая функция объявляется достаточно просто: <font size="2" face="Courier New" color="black"><font color="#0000ff">inline</font> <font color="#0000ff">void</font> foo<font style="color: #008000;">(</font><font color="#0000ff">int</font> <font color="#000040">&</font> _i<font style="color: #008000;">)</font><br /><font style="color: #008000;">{</font><br /> _i<font color="#000040">++</font><font color="#008080">;</font><br /><font style="color: #008000;">}</font></font> Но речь сейчас не об этом. Мы рассмотрим использование подставляемых методов
C++ MythBusters. Миф о подставляемых функциях