私が書いたコードスニペットのアセンブリを見て、指示されたmovsxd
は、ret
変数が32ビットの場合にのみ表示されることに気付きました。 ret
が64ビットの場合は、直接使用されます。mov BYTE PTR [rdi+rbp+86], al
。C言語で64ビットプラットフォームを対象とする場合は、配列参照に64ビット変数を使用する方が良いでしょうか?
; 861 : _BitScanForward(&depth, subject);
movsx edx, dx
; 862 : qry_args->lo_refs[++ret] = (BYTE)depth;
inc ebp // ret is in ebp
bsf ecx, edx
movsxd rax, ebp // convert 32-bit ebp to 64-bit rax
; 865 : subject ^= (1 << depth);
; 866 : nulls_mask.lo |= (1 << depth);
movsx r9d, r9w
btc edx, ecx
bts r9d, ecx
mov BYTE PTR [rax+rbx+86], cl // 64-bit rax used by mov
mov
OPが64ビットモードで64ビットレジスタを必要とするので、それは(例えば配列referencersとして)メモリを参照するために使用される任意の変数が、理想的には64ビットであるべきであることを私には理にかなっています。
しかし、2 ^^ 31回の繰り返しを超えないループでは、単にint
を使用するのが一般的です。実際には、long long
(int64
)を64ビットコードのベストプラクティスとして使用する必要がありますか?これに関するコメント?
私はここに示されているものを超えてこれをテストすることに苦しんでいません。
ps。これはマイクロ最適化問題ではありません。フォームの問題です。私には、コンパイラで使用される型を使用するのが理にかなっています。
Info:VS2016で最大限の最適化を使用してコンパイルしています。
"(配列参照者のような)メモリを参照するために使用される_変数は、あなたの書き込みポインタによるもので、64ビットのメモリ構成では64ビットでなければなりません。 'int'はマシンレジスタのネイティブサイズです。 –
'int'は4バイト幅です。 https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx https://www.google.com.tw/webhp#q=size%20of%20int%20in%20c – IamIC