производительность — Как заставить с ++ компилятор использовать регистры?

у меня есть for цикл в моем (c ++ .Net Win32 Console) коде, который должен выполняться максимально быстро. Поэтому мне нужно, чтобы компилятор использовал регистр вместо того, чтобы хранить его в баран.

MSDN говорит:

Ключевое слово register указывает, что переменная должна храниться в
реестр машин, если возможно.

Вот что я попробовал:

for(register int i = 0; i < Size; i++)

Когда я смотрю на код дизассемблирования, который генерирует компилятор, я вижу:

012D4484  mov         esi,dword ptr [std::_Facetptr<std::codecvt<char,char,int> >::_Psave+24h (12DC5E4h)]
012D448A  xor         ecx,ecx
012D448C  push        edi
012D448D  mov         edi,dword ptr [std::_Facetptr<std::codecvt<char,char,int> >::_Psave+10h (12DC5D0h)]
012D4493  mov         dword ptr [Size],ebx
012D4496  test        ebx,ebx
012D4498  jle         FindBestAdd+48h (12D44B8h)  //FindBestAdd is the function the loop is in
012D449A  lea         ebx,[ebx]

Я ожидаю, что ассемблерный код не будет генерировать dword ptr где я использовал register ключевое слово.

Итак, как бы я узнал если это возможно для компилятора использовать регистр и что я должен сделать, чтобы заставить компилятор читать / записывать напрямую из / в регистры.

1

Решение

В вашем случае компилятор, скорее всего, все равно будет использовать регистр, если вы предоставите правильные опции оптимизации.

В общем, единственный способ принудительно ввести переменную в регистр — использовать встроенную сборку.

2

Другие решения

register Ключевое слово является лишь подсказкой и игнорируется большинством современных компиляторов. По сути, это потому, что компилятор лучше оптимизирует и вычисляет, что следует поместить в регистр, чем программист.

Таким образом, вы не можете заставить компилятор использовать регистры, и вы не должны, даже если бы могли. Если вы хотите оптимальную скорость, включите максимальный уровень оптимизации в настройках компилятора.

13