Sandy の indirect branch

#include <x86intrin.h>
#include <stdio.h>
struct Base {
    virtual void f() = 0;
};
#define GENCLASS(name)                          \
    struct name : public Base { virtual void f(){} };

GENCLASS(A);GENCLASS(B);GENCLASS(C);GENCLASS(D);GENCLASS(E);GENCLASS(F);

int main()
{
#define NOBJ 6

    Base *a[][NOBJ] = {
#ifdef HOGE
        {new A(), new A(), new A(), new A(), new A(), new A()}, // 全ヒット    : Sandy 42
        {new A(), new B(), new A(), new A(), new A(), new A()}, // 一個だけ違う: Sandy 42
        {new A(), new B(), new A(), new A(), new B(), new A()}, // ふたつ違う  : Sandy 55-65??
#endif
        {new A(), new B(), new C(), new D(), new E(), new F()}, // 全部違う    : Sandy(-DHOGE) 114, Sandy(-DHOGE無し) 95
        {new A(), new E(), new C(), new A(), new E(), new F()}, // 全部違う    : Sandy(-DHOGE) 140, Sandy(-DHOGE無し) 37
    };

    int npattern = sizeof(a)/sizeof(a[0]);

    for (int pat=0; pat<npattern; pat++) {
        for (int iter=0; iter<8; iter++) {
            int nloop = 1024*1024*8;
            int b = __rdtsc();
            Base **tbl = a[pat];
            for (int i=0; i<nloop; i++) {
                for (int j=0; j<NOBJ; j++) {
                    tbl[j]->f();
                }
            }
            int e = __rdtsc();

            printf("pattern:%d iter:%d %f\n", pat, iter, (e-b)/(double)nloop);
        }
    }
}

こういうので、-DHOGEを付けてビルドしたものと付けないもので、結果が変わるのって、納得できない…
真面目に考えたら、パターン履歴の初期値とかでわかるかもしれないけど。