2

(c++ .Net Win32 コンソール) コードにforループがあり、できるだけ速く実行する必要があります。そのため、コンパイラにRAMに格納する代わりにレジスタを使用させる必要があります。

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 ptrwhere I usedregisterキーワードを生成しないことを期待しています。

では、コンパイラがレジスタを使用できるかどうかを知るにはどうすればよいでしょうか。また、コンパイラにレジスタから直接読み書きさせるにはどうすればよいでしょうか。

4

2 に答える 2

14

registerキーワードは単なるヒントであり、最近のほとんどのコンパイラでは無視されます。本質的に、これはコンパイラーがプログラマーよりもレジスターに何を配置する必要があるかを最適化および把握するのに優れているためです。

したがって、コンパイラにレジスタの使用を強制することはできません。最適な速度が必要な場合は、コンパイラ設定で最大最適化レベルをオンにします。

于 2012-12-07T13:35:21.800 に答える
4

あなたの場合、適切な最適化オプションを指定すると、コンパイラはとにかくレジスタを使用する可能性が最も高くなります。

一般に、変数を強制的にレジスタに格納する唯一の方法は、インライン アセンブリを使用することです。

于 2012-12-07T13:39:00.123 に答える