Я не смог воспроизвести ваши наблюдения, тестируя на x86_64 как VS10, так и g ++. Локальный вариант немного быстрее, вероятно, из-за того, что Алан Стоукс описал в своем комментарии, но не более ~ 10%. Вы должны проверить время, постараться исключить любые другие проблемы, и лучше всего свести весь ваш код к очень простому тестовому прибору, который все еще показывает это поведение.
Мне кажется, мой тестовый сценарий очень неплохо напоминает ваш сценарий, по крайней мере, так, как вы его описали:
#include <iostream>
#include <boost/timer.hpp>
const int max_iter = 1<<31;
const int start_value = 65535;
struct UseMember
{
int member;
void foo()
{
for(int i=0; i<max_iter; ++i)
{
if(member%2)
member = 3*member+1;
else
member = member>>1;
}
std::cout << "Value=" << member << std::endl;
}
};
struct UseLocal
{
void foo()
{
int local = start_value;
for(int i=0; i<max_iter; ++i)
{
if((local%2)!=0) /* odd */
local = 3*local+1;
else /* even */
local = local>>1;
}
std::cout << "Value=" << local << std::endl;
}
};
int main(int argc, char* argv[])
{
/* First, test using member */
std::cout << "** Member Access" << std::endl;
{
UseMember bar;
bar.member = start_value;
boost::timer T;
bar.foo();
double e = T.elapsed();
std::cout << "Time taken: " << e << "s" << std::endl;
}
/* Then, test using local */
std::cout << "** Local Access" << std::endl;
{
UseLocal bar;
boost::timer T;
bar.foo();
double e = T.elapsed();
std::cout << "Time taken: " << e << "s" << std::endl;
}
return 0;
}