Лучший способ загрузить переменную класса в регистр - позволить компилятору сделать это за вас.
Поскольку компилятор всегда должен предполагать худшее, когда дело доходит до чтения данных из памяти, онможет быть вынужден прочитать значение из члена класса несколько раз, несмотря на то, что вы знаете, что значение не изменилось.
Например, в приведенном ниже коде функции do_stuff
, компилятор не может предположить, что значение mX
остается неизменным по вызову foo()
.Следовательно, нельзя помещать его в регистр процессора.
int glob;
int glob2;
void foo();
class Test
{
public:
Test(int x) : mX(x) { }
void do_stuff();
private:
int mX;
};
void Test::do_stuff()
{
glob = mX;
foo();
glob2 = mX;
}
С другой стороны, в следующем случае исходный код записывается так, что tmp
не может изменить функциювызовите, так что компилятор может безопасно поместить его в регистр.
void Test::do_stuff()
{
int tmp = mX;
glob = tmp;
foo();
glob2 = tmp;
}
Когда дело доходит до встроенного ассемблера, я настоятельно рекомендую вам не использовать его.При внедрении C ++ ситуация еще хуже, поскольку базовое представление объекта класса не так просто, как представление структуры C (которое должно быть размещено в памяти точно так, как объявлено).Это означает, что небольшое изменение в классе или переход на более новый компилятор может нарушить ваш код.