2

次のCコードを検討してください-

char sum_char(char a,char b)
{
   char c = a+b;
   return c;
}

それには-

  1. 2 番目のパラメーターを符号拡張に変換します。
  2. 署名された拡張パラメーターを b としてスタックにプッシュします。
  3. 最初のパラメーターを符号拡張に変換します。
  4. 署名された拡張パラメーターを a としてスタックにプッシュします。
  5. a&bを足して、結果をcharにキャストしてcに格納する。
  6. C は再び符号拡張されます。
  7. 符号拡張された c は戻り値レジスタにコピーされ、関数は呼び出し元に戻ります。
  8. 結果の呼び出し元関数を再度格納するには、int を char に変換します。

私の質問は -

  1. 誰がこれをしますか?
  2. そんなに多くの変換を行う必要性は何ですか?
  3. マシン/コンパイラのパフォーマンスを低下/向上させますか?
  4. パフォーマンスが低下している場合、パフォーマンスを向上させるにはどうすればよいですか?
4

4 に答える 4

2

あなたが説明する変換は、抽象マシンでのみ実行されます。同じ観察可能な動作につながる場合、コンパイラはこれらすべてをショートカットできます。

最適化をオンにすると、コンパイラはこれを次のアセンブラに変換します

sum_char:
.LFB0:
    .cfi_startproc
    leal    (%rsi,%rdi), %eax
    ret
    .cfi_endproc
.LFE0:
    .size   sum_char, .-sum_char

これは、1 つの加算 (命令に隠されていlealます) とretジャンプです。

于 2012-10-02T14:28:44.237 に答える
2
  1. 誰がこれをしますか?- 最終的に、これを行うのは CPU です。コンパイラは、CPU が変換を実行するためのすべての関連命令を生成します。
  2. そんなに多くの変換を行う必要性は何ですか? - 複数の C コンパイラでサポートされている複数のプラットフォーム間で結果の一貫性を確保するには、変換が必要です。
  3. マシン/コンパイラのパフォーマンスを低下/向上させますか? - これにより、「何もしない」場合に比べてパフォーマンスが低下しますが、誰も違いに気付かないでしょう。
  4. パフォーマンスが低下している場合、パフォーマンスを向上させるにはどうすればよいですか? - なし: s に対して算術演算を実行する必要がある場合は、chars に対して算術演算を実行しますchar。オプティマイザーに、プラットフォームの不要な命令をすべて削除してもらいます。ほとんどの場合、CPU には C 言語が必要とするセマンティックと互換性のある命令があるため、生成されるコードは非常に短くなります。

もちろん、符号付き文字を操作する必要がない場合は、符号なし文字を操作できます。これにより、かなりの符号拡張が排除されました。

于 2012-10-02T14:32:45.663 に答える
1
  1. 実行時のコード。コンパイラは、プログラミング言語に指定されたセマンティクスを実装するために必要なコードを生成します。
  2. あなたが話している「スタック」へのプッシュについてはわかりません。私の知る限り、Cにはそのような要件はありません。
  3. それは意味がありません。何と比べて?
  4. 無意味なc変数を削除してみてくださいreturn (char) (a + b);。とはいえ、この関数で「最適化」する必要はあまりないと思います。非常に小さなコードにコンパイルする必要があります。インライン化できれば、おそらく1命令程度です。
于 2012-10-02T14:28:27.590 に答える
0

ご質問の詳細がわかりません。ソースを引用せずに符号拡張について繰り返し言及しています。CPUのビット数に合わせてデータ型が拡張されると想定していると思いますがchar、そうではないという保証はないと思います。

ただし、漠然とした質問に答えるための刺し傷として:

  1. コンパイラは、コードの記述に応じてこれを行います。誰がコードを書きますか? 開発者だと思います。 質問を書いたとき、 あなたはこれをしました。
  2. 必要がある場合(ソースを引用しないため)、CPUが算術演算をネイティブに処理できるようにするためだと思います。
  3. 技術的にはそれを減らすことができますが、任意のビットネスを持つ理論上のマシンと比較するだけです。現実的には、目立った違いはありません。
  4. アーキテクチャのネイティブ ビット数に一致するデータ型を使用すると、パフォーマンスがわずかに向上します。ただし、これは非常にわずかであり、通常は不便に値するものではありません。
于 2012-10-02T14:33:22.723 に答える