最近、私はAssembly言語に遭遇しました。アセンブリには、2つのレジスタの内容を交換するxchg指令があります。すべてのCコードが最初にAssemblyに変換されるので、ヘッダstdio.hのようにCにスワップ関数inbuiltがあったといいでしょう。コンパイラがスワップ機能を検出するたびに、アセンブリファイルにxchg命令を追加することができます。 なぜこのスワップ関数がCで実装されていないのですか?Cで組み込みのスワップ関数がないのにAssemblyにxchgがあるのはなぜですか?
答えて
は、クロスプラットフォーム言語です。アセンブリはアーキテクチャ固有のものです。すべてのアーキテクチャがそのような命令を持っているわけではありませんさらに、Cは、機械語の命令セットと機能に対応する必要はなく、 "人間"言語と機械語の間を橋渡しして模倣するのではなく、この具体的なアーキテクチャのCコンパイラは、このスワップ命令の拡張子を持っているか、スマートなら十分にこの命令を使うようスワッピングコードを最適化します。
これは、レジスタに収まり、レジスタ内にある変数に対して機能します。大きな構造体や変数がメモリに格納されている場合は機能しません(reg Xに変数Aをロードし、reg YにBを入れてスワップすると、スワッピングをスキップしてAのYとBのXを直接ロードできます)。これらは、レジスタであることを起こる場合...
int a;
int b;
int tmp;
tmp=a;
a=b;
b=tmp;
を::
言っては何もスワップ命令を使用するために与えられたアーキテクチャのためのコンパイラがコンパイルに防ぐない、と述べたそれはCではないという事実コンパイラがそれを使用しないことを意味しません。
xchg
は非常に基本的な命令ですが、これはCに相当するものが必要であるということを意味しません。 C が時々がアセンブリに直接マップされているという事実はあまり関係ありません。標準では「アセンブリ」について何も言及していません(アセンブリにマップする理由と、別の低レベル言語ではないのはなぜですか?)。
質問するかもしれません:Cに組み込みのベクトル命令がないのはなぜですか?彼らは主に利用可能になっています!
コンパイラの助けもあります:変数を入れ替えるのは非常に目に見えるパターンなので、このような最適化を実装するのは難しくありません。また、インラインでasm
が必要です。
swap()
はC
1.関数呼び出しの意味を説明できる2つのポイントがあります。
swap()
機能を含むが、Cで非常に基本的な設計上の決定を破る:swap()
だけで動作することができますが、参照渡しのセマンティクス(C++は言語に追加されていますが、C言語では存在しません)であり、値渡しではありません。可能なアセンブラ命令とは別に
の
2.多様性は、通常、割り込み処理命令などの多様なこれは命令を含み、純粋なCから完全にアクセスできません任意のCPUアーキテクチャ上のアセンブラ命令のかなりの数があり、仮想メモリ空間操作命令、I/O命令、ビット・バイディング命令(GoogleのPPC命令rlwimi
、これは特に強力な例です)など
任意のOSは非常に少なくともいくつかの小さなに含まなければならない理由である、これらのいくつかは、オペレーティングシステムを実装するために重要であるC.
のような汎用的な言語では、これらの任意のかなりの数が含まれるように、単純に不可能ですアセンブラコードの量これらは、通常、インラインアセンブラを使用していくつかの関数にカプセル化されているか、プリプロセッサディレクティブとしてカーネルヘッダに定義されています。他の命令はそれほど重要ではなく、最適化にのみ有効です。これらはコンパイラの最適化によって生成され、多くのコンパイラがそれらを生成します(ベクトル関数のクラス全体がこのカテゴリに入ります)。
この広大な多様性に直面して、Cのデザイナーはちょうどどこかでそれをカットしなければなりませんでした。そして、(+、 - 、〜、&、|、& &、||などのような単純な演算子として表現できるものを提供することを選択しましたが、swap()
関数のような関数呼び出し構文を必要とするものは何も提供しませんでした。あなたは提案する。
- 1. IE8のいくつかの組み込み関数がFunctionのインスタンスではないのはなぜですか?
- 2. Objective Cに組み込み関数がありますか?
- 3. Cでチャネージケースの組み込み関数はありますか?
- 4. Hazelcastに組み込みのHashMapStreamSerializerがないのはなぜですか?
- 5. 関数呼び出しのオーバーヘッド - Pythonの組み込み関数が組み込み関数より速いのはなぜですか?
- 6. いくつかの組み込み関数の構文エラーメッセージが異なるのはなぜですか?
- 7. Python:組み込みクラスインスタンスに__dict__属性がないのはなぜですか?
- 8. 組み込み用のC/C++組み込み関数VMOVD
- 9. 組み込みARMでセグメンテーションフォールトにつながるBoost :: Thread関数
- 10. absのような組み込み関数がnumpy配列で動作するのはなぜですか?
- 11. DateTimeの組み込み型がないのはなぜですか?
- 12. 組み込み関数 'execl'に互換性のないコンパイルエラーがあります
- 13. Pythonの組み込み関数の型がユニークである
- 14. 組み込み関数が組み込まれていない並べ替え
- 15. dictが組み込みテストよりも速く組み込みをテストするのはなぜですか?
- 16. 。組み込み関数がpython3.5で動作しない
- 17. 組み込み関数の__self__が、それが属する組み込みモジュールを返すのはなぜですか?
- 18. なぜsum()とmin()のPython組み込み関数がはるかに優れていますか?
- 19. Windowsシェル(cmd.exe)の組み込みコマンドがstdinから読み込まれないのはなぜですか?
- 20. Rustに組み込みのID関数はありますか?
- 21. 組み込み関数/組み込み関数のテスト
- 22. pythonスライスに組み込まれていない組み込み型以外はなぜですか?
- 23. シェル - 組み込みのRANDOM関数が1を返すのはなぜですか?
- 24. 組み込みコンストラクタの中には、なぜ小文字で始まるものがありますか?
- 25. ページの読み込みが遅いのはなぜですか?
- 26. javascriptの新しい組み込みメソッドが古いブラウザでサポートされないのはなぜですか?
- 27. Windows組み込み標準が有効でないwin32 C++
- 28. Pythonに `and`や` or`の組み込み関数版がありますか?
- 29. Jupyterノートブックで組み込み関数のドキュメントを見るには?
- 30. 実行時に/ src/main/resourcesにあるファイルが読み込みできないのはなぜですか?
Cが開発されたとき、これは一般的な指示ではなかったかもしれないので、彼らはその点を見ませんでした。 – Barmar
"アセンブリにはxchgディレクティブがあります" *どの* assember? *プラットフォームは何ですか? –
Cでは多くの機械語で回転機能はありません。そしてどの「アセンブリ」を参照していますか?多くのCPUはそのような命令を持っていません。 – Olaf