2016-10-03 4 views
0

私が書いたコードスニペットのアセンブリを見て、指示されたmovsxdは、ret変数が32ビットの場合にのみ表示されることに気付きました。 retが64ビットの場合は、直接使用されます。mov BYTE PTR [rdi+rbp+86], alC言語で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 longint64)を64ビットコードのベストプラクティスとして使用する必要がありますか?これに関するコメント?

私はここに示されているものを超えてこれをテストすることに苦しんでいません。

ps。これはマイクロ最適化問題ではありません。フォームの問題です。私には、コンパイラで使用される型を使用するのが理にかなっています。

Info:VS2016で最大限の最適化を使用してコンパイルしています。

+0

"(配列参照者のような)メモリを参照するために使用される_変数は、あなたの書き込みポインタによるもので、64ビットのメモリ構成では64ビットでなければなりません。 'int'はマシンレジスタのネイティブサイズです。 –

+0

'int'は4バイト幅です。 https://msdn.microsoft.com/en-us/library/9c3yd98k.aspx https://www.google.com.tw/webhp#q=size%20of%20int%20in%20c – IamIC

答えて

4

アレイインデックスにはsize_tタイプを使用してください。配列インデックスを保持するのに十分な大きさです。通常、64ビットプラットフォームでは64ビット、32ビットプラットフォームでは32ビットを保持します。

は、あなたのケースでlong longを使用することが一般的に良いアイデアではありませんhttps://stackoverflow.com/a/2550799/909655

+0

size_tを使用するようにコードを修正すると、ASM操作の数がわずかに1%減少しました。それはまさにお伝えしています。 – IamIC

3

を参照してください。コードを読む次の開発者は、コードが大きな数を処理する必要があるか、または元のプログラマーが自分が何をしているのか分からないと考えるでしょう。

size_tのいずれかを使用して、変数が任意の配列サイズを処理できることを示すか、またはintを使用する方がよく、通常の範囲要件を持つ汎用変数であることを示します。

どの整数型を選択すればよいですか?

は、通常の整数変数に使用されます。これは、別のタイプを選択する理由がない限り、使用すべきタイプです。それが使用されて使用するための良いサイズ(何らかの理由で、典型的には、そのプラットフォーム上の範囲、メモリ消費と性能との間の良好なトレードオフ)

チャーであるためint、プラットフォーム開発者によって選択された大きさを有しています文字列とバイナリデータの場合バイナリ演算子(特にシフト演算子)を使用する場合は、符号なしの文字を使用する必要があります。等アレイ/メモリサイズに使用さ

size_tの、配列インデックス、必要に応じて

他INTサイズ(短い長い長い長い、固定サイズ)が使用されています。固定サイズは、通常、異なるシステム間で交換されるデータに使用されます。long/shortは、通常、標準関数の戻り値がそれぞれのサイズの場合に使用されます。 long longは、大きな数を格納する必要がある場合に使用されますが、実際には大きな整数の場合、BigIntライブラリが必要です。

+0

非常に参考になりました、ありがとうございます。 – IamIC

+0

重要な点として、size_tを使用するようにコードを修正すると、ASM操作の数が1%をわずかに減らしました。それはまさにお伝えしています。 – IamIC

+0

@IamIC私は通常コードの可読性を最優先にしていますが、パフォーマンスは最適化しません。パフォーマンスクリティカルなコードを処理する場合にのみ、パフォーマンスの最適化が必要になります。 https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize –

関連する問題