問題タブ [fastcall]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Fastcall GCC の例
gcc で使用するための fastcall の使用例を提供してくれる人がいますか? 可能であれば、fastcall を使用せずに同等の呼び出しを提供し、それらがどのように異なるかを説明していただけますか?
c++ - fastcallは本当に速いですか?
fastcall呼び出し規約は、cdeclなどの他の呼び出し規約よりも本当に高速ですか?呼び出し規約によってパフォーマンスがどのように影響を受けるかを示すベンチマークはありますか?
visual-c++ - Visual Cで使用されるfastcallキーワードは何ですか?
fastcall
多くの関数の前に表記が追加されているのを見てきました。なぜ使われるのですか?
c - 「fastcall」呼び出し規約による「インライン」関数のパフォーマンスへの影響
非常に高い頻度で呼び出される CRC 計算関数があります。inline
私はそれを作ってみたのですでに宣言しました__attribute((hot))__
が、それが何かを買うかどうかはわかりません. にしようと考えていfastcall
ます。
gcc docsによると、
fastcall Intel 386 では、fastcall 属性により、コンパイラは最初の引数 (整数型の場合) をレジスタ ECX に渡し、2 番目の引数 (整数型の場合) をレジスタ EDX に渡します。後続のおよびその他の型付き引数は、スタックに渡されます。呼び出された関数は、引数をスタックからポップします。引数の数が可変の場合、すべての引数がスタックにプッシュされます。
fastcall
入力パラメータはスタックにプッシュするのではなく、レジスタを介して送信されるため、本質的に高速になります。を使用するとinline
、コンパイラは関数呼び出しを関数の本体に置き換えます。
質問は、 evenfastcall
と一緒に使用inline
すると意味がありますか?
unix - 64ビットでのFastcall
私は32ビットの呼び出し規約の違いについて読んでいます。fastcall
対stdcall
試練です。
私が読んだところによると、2つの規則には大きな混乱があり、この混乱を避けるために64ビットが標準化されました。
私は尋ねなければなりません、なぜfastcall
選ばれたのですか?
また、fastcall
とstdcall
はwin32用語であるため、引数を渡すためにレジスタを使用する、または使用しない関数呼び出しのUNIX用語は何ですか?
assembly - MASM x86 fastcall 関数の宣言...どのように?
VisualStudio 2010 C プログラムで fastcall 規則アセンブリ ルーチンを呼び出そうとしています。
これは C コードでの宣言です。
これは、アセンブリ コードでの宣言です。
次のリンカ エラーが発生します。
私はばかげた間違ったことをしていると確信していますが、それを見ることはできません。
MS のドキュメントは非常に曖昧であるため、理解するのはかなり困難です。過去の霧の中で、アセンブラも名前のマングリングを行っていることを思い出しました。
これは、その方法に関する最も明確なリファレンスであり、正確に従っていると思います。それは言います、
手がかりはありますか?
ありがとう...
c++ - 標準の __cdecl の代わりに __fastcall を使用すべきではないのはなぜですか?
私は何人かの人々が言っているのを聞いて、他の呼び出しの代わりに2つのパラメータを登録する__fastcall
よりも速い__cdecl
と言っています。__stdcall
しかし一方で、これは C で使用される標準ではありません。
__fastcall
Cの標準のように望ましくない理由と、コードでこれをいつ使用するかを知りたいです。
c - Cは、スタックとレジスタを使用して手動で関数を呼び出します
スタックを操作するのは大変なことだと思いますが、私にとっては素晴らしい教訓になると思います。インターネットを検索したところ、呼び出し規約が見つかりました。私はその仕組みとその理由を知っています。「Callee clean-up stack」のいくつかをシミュレートしたいのかもしれませんが、おそらくstdcall、fastcallは問題ではありません。重要なのは、誰がスタックをクリーンアップするかということです。そうすれば、私が行う作業が少なくなります:)
例えば。私はCで関数を持っています
カレーだろう
そして、タイプ void* のこの関数へのポインタを持っています。
そして、私は関数 Caller を持っています
以上で、呼び出し規約「Calle clean-up」を使用するときに役立ちます。
私はそれを行う方法がわかりません。アセンブラで実行できることは知っています。しかし、私はそれを恐れており、この言語に「触れる」ことはありません。私はCでその呼び出しをシミュレートするのは素晴らしいことですが、誰かがASMでそれを行うことができれば、私はうんざりします:)
また、関数を手動で呼び出す方法がわかると、いくつかのパラメーター(その数とサイズがわかっている場合)と任意のタイプの関数を使用して関数を呼び出すことができます。したがって、その関数が正しい呼び出し規則にある場合、任意の言語で任意の関数を呼び出すことができます。
Windows OS x64 と MinGw を使用しています
x86 - x86 で MS fastcall が最初の引数に EAX を使用しないのはなぜですか?
ウィキペディアによると、「Microsoft または GCC __fastcall 規則 (別名 __msfastcall) は、ECX および EDX に適合する最初の 2 つの引数 (左から右に評価) を渡します。残りの引数は右から左にスタックにプッシュされます。」
arg0、arg1、arg2 に EAX、ECX、EDX を使用しないことにしたのはなぜですか? 彼らが引数をレジスタにプッシュするつもりなら、なぜ 2 で止まるのですか? Borland の fast all does がこれを行うことを知っているので、Microsoft は単に違いを出すために EAX を使用しないことを選択したのでしょうか?