у меня есть 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
ключевое слово.
Итак, как бы я узнал если это возможно для компилятора использовать регистр и что я должен сделать, чтобы заставить компилятор читать / записывать напрямую из / в регистры.
В вашем случае компилятор, скорее всего, все равно будет использовать регистр, если вы предоставите правильные опции оптимизации.
В общем, единственный способ принудительно ввести переменную в регистр — использовать встроенную сборку.
register
Ключевое слово является лишь подсказкой и игнорируется большинством современных компиляторов. По сути, это потому, что компилятор лучше оптимизирует и вычисляет, что следует поместить в регистр, чем программист.
Таким образом, вы не можете заставить компилятор использовать регистры, и вы не должны, даже если бы могли. Если вы хотите оптимальную скорость, включите максимальный уровень оптимизации в настройках компилятора.