VC++の関数のアドレス

C言語で、関数のアドレスはポインタとして取得できるはずだが、Visual C++の場合、それは実際にはスタブでそこからジャンプ命令で関数の本体のアドレスに飛ぶ。引数のある関数の場合、その引数のアドレスの前が戻り先のアドレスであるはずなので、下記のようなコードで、関数の呼び出し元の関数を推定できる。アドレスが分かったら、[デバッグ]>[ウィンドウ]>[逆アセンブル]で調べてみると良い。

#include<stdio.h>
typedef unsigned int UINT;
typedef unsigned char BYTE;

void hoge(int a);

void piyo(void)
{
    printf("piyo\n");
    hoge(1);
}
void fuga(void)
{
    printf("fuga\n");
    hoge(2);
}

void hoge(int a)
{
    // 引数のアドレスの前にこの関数からの戻り先のアドレスが格納されているはず
    UINT p = *(UINT*)(((BYTE*)&a)-4);
    printf("hoge is called from %08X\n", p);
}

int main(void)
{
    // これが関数のアドレスのはずだが、実はスタブで…
    UINT ptr_piyo = (UINT)(void*)piyo;
    // この相対アドレスにジャンプする
    UINT offset_piyo = *(UINT*)((BYTE*)ptr_piyo + 1);
    // なので、関数の本体のアドレスはここ
    UINT real_piyo = (UINT)((BYTE*)ptr_piyo + offset_piyo + 5);  
    printf("piyo %08X\n", real_piyo);

    UINT ptr_fuga = (UINT)(void*)fuga;
    UINT offset_fuga = *(UINT*)((BYTE*)ptr_fuga + 1);
    UINT real_fuga = (UINT)((BYTE*)ptr_fuga + offset_fuga + 5);
    printf("fuga %08X\n", real_fuga);

    piyo();
    fuga();
    
    getchar();
    return 0;
}

なんだかよく分からないstd::for_each

いまさらながら、C++のstd::vectorの使い方を調べるなど。動的配列ということは分かったし、イテレータの使い方も分かったけど、std::for_eachを使った回し方はなんかよく分からない。ここまでトリッキーなことをして、どういうご利益があるのかな?

#include <stdio.h>
#include <vector>
#include <algorithm>

// intのベクター(動的配列)
typedef std::vector<int> VECTOR;

// 関数オブジェクト
class PrintInt
{
public:
    // ()演算子の実装
    void operator()(int num)
    {
        printf("PrintInt %d\n",num);
    }
};

int main(void)
{
    VECTOR v;
    for(int i = 0; i < 10; ++i )
    {
        // ベクターの末尾に要素を追加する
        v.push_back( i * 10 );
    }

    // ふつうに配列の添え字を回す
    for(int i = 0; i < v.size(); i++ )
    {
        printf("v[%d] = %d\n", i, v[i]);
    }

    // イテレータで回す
    for(VECTOR::iterator it=v.begin(); it!=v.end(); it++)
    {
        printf("*it = %d, it++\n", *it);
    }

    // std::for_eachで回す ...なんだかよく分からない
    std::for_each(v.begin(), v.end(), PrintInt());

    getchar();
    return 0;
}