問題タブ [function-pointers]
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++ - ピュア バーチャル メソッド VS. 関数ポインタ
最近、私は Thread クラス ライブラリを設計しており、次のような Thread 抽象クラスを作成しました。
実際のスレッド クラスは、この抽象クラスを継承doOperation
し、独自のロジックでメソッドを実装します。これはStrategy Patternに似ています。
問題は、次の関数でスレッドの実行を定義する C バックエンド ライブラリに依存していることです。
ご覧のように; 2 番目のパラメーターは、スレッドのループ (メイン関数) への関数ポインターであり、ここに問題があります。この C 関数を使用してrun
メソッド内のスレッドを開始するため、アドレスをdoOperation
2 番目のパラメーターに渡しますが、型が一致しないため、これを行うことができません。
ポインターを返すために使用しようとしましたreinterpret_cast
が、ISO-C++ は、初期化されていない関数メンバーのポインターを返すことを禁止しています。この競合を克服する方法がわかりません。静的メソッドを使用することが唯一の解決策だと思いますが、それは私の設計パターンを爆破します!
function - Luaを使用して関数の本体にアクセスする
ここで基本に戻りますが、Luaでは次のようにテーブルを定義できます。
テーブル参照自体を印刷すると、その参照へのポインタが返されます。その要素にアクセスするには、インデックスを指定する必要があります(つまり、配列とまったく同じように)
今、関数は別の話です。次のような関数を定義して印刷できます。
定義された関数の本体にアクセスする方法はありますか?小さなコードビジュアライザーをまとめようとしていますが、特定の関数を特別な関数/変数で「シード」して、ビジュアライザーがコードに「フック」できるようにしたいのですが、関数を次のいずれかから再定義できる必要があります。変数または文字列。
c - 関数ポインターを別の型にキャストする
void (*)(void*)
コールバックとして使用する関数ポインターを受け入れる関数があるとします。
さて、次のような関数があるとします。
これを安全に行うことができますか?
私はこの質問を見て、「互換性のある関数ポインター」にキャストできると言っているいくつかの C 標準を見てきましたが、「互換性のある関数ポインター」の意味の定義が見つかりません。
c++ - 「テンプレート化された関数ポインター」を達成する方法は他にありますか?
手動で行う手間をかけずに、テンプレート化された関数ポインターのセットを確立することは可能ですか? これは、私が話していることを説明するための例です。
頻繁に呼び出される関数「write」があり、その 2 つの実装 (write0 と write1) を動的に切り替えられるようにしたいとします。これらの書き込み関数は、引数の型でテンプレート化されています。これを行う 1 つの方法は、内部で if ステートメントを使用するテンプレート化されたフロントエンド関数 write() を使用することです。
これは私のニーズに対して十分に高速であることが判明しましたが、関数ポインターを使用して同じことができるかどうか疑問に思っていました (楽しみのためだけに)。このアプローチの問題点は、関数ポインタの設定が面倒なことです。write() の理想を本質的に達成するが、条件付き (直接静的ディスパッチ) を使用しない他の方法はありますか?
(その他の「ルール」: Msg クラスを write() メソッドを持つように変更することはできず、use サイト コードを変更して Msgs を Msgs のアダプターに置き換えることはできません。)
FWIW、私はこの記事が基本的に私がここで言っているのと同じことを言っているのを見つけました。
c++ - static vs extern "C"/"C++"
静的メンバー関数と extern "C" リンケージ関数の違いは何ですか? たとえば、C++ で「makecontext」を使用する場合、関数へのポインターを渡す必要があります。「makecontext」はCであるため、Googleはextern「C」リンケージを使用することをお勧めします。しかし、静的を使用しても同様に機能することがわかりました。私は運がいいのか、それとも…
対
EDIT:静的メンバーバージョンが機能しないコンパイラまたはアーキテクチャを表示できますか(コンパイラのバグではありません)?
c++ - 関数ポインタは正確にどこを指していますか?
すべてのプリミティブ データ型とオブジェクトにメモリが割り当てられていることを考えると、これらの型へのポインターを直感的に想像するのは簡単です。
しかし、関数ポインタは正確にはどこを指すのでしょうか? 命令が機械語に変換されてメモリに存在する場合、関数命令の開始に対応するメモリ位置を指していると考えるべきでしょうか?
不正なメモリアクセスが原因で、ポインターに多くのエラーが発生します。関数ポインタが命令メモリではなくデータメモリを指している場合、エラーが発生しますか?
c++ - &func または class::func を C++ で使用することはできますか?
これは矛盾しているようです。Example::func の代わりに &Example::func を使用するのはなぜですか? Example::func または &exampleFunction の用途はありますか? 関数への参照を作成して、Example::func を除外することはできないようです。exampleFunction は既にポインターを返しているため、&exampleFunction を使用する方法は考えられません。
dll - 関数ポインターを引数として dll 関数に渡し、それらを dll 内から呼び出すことは安全ですか?
いくつかの(dllかどうかに関係なく)関数ポインタを引数としていくつかのdll関数に渡し、それらをdll内から呼び出したいと思います。http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fprefで情報を見つけたので安全なのだろうか。 htm :
DLL コードでは、関数ポインターが関数記述子を指していると見なされます。関数ポインター呼び出しは、まずポインターを逆参照して関数アドレスを取得することによって行われます。そして、関数エントリに分岐します。非 DLL 関数ポインタが DLL コードに渡されると、関数エントリを直接指します。このようなポインターを介して逆参照しようとすると、未定義の関数アドレスが生成されます。その後の未定義アドレスへの分岐により、例外が発生する場合があります。
この規則は、Visual Studio やその他のコンパイラにも適用されますか?
正確に私がやろうとしているのは、さまざまな dll 関数と非 dll 関数の間のメモリ割り当てと割り当て解除の問題を解決することです。私の考えは、2 つの関数ポインター (一般的な割り当て関数と割り当て解除関数) を初期化 (Initialize(&malloc, &free) など) ですべての dll に渡し、これらの一般的で常に互換性のある関数を使用してすべてのメモリ管理を行うことです。
c# - 関数ポインタを使用する利点
私は数年前からプログラミングをしていて、場合によっては関数ポインタを使用しています。私が知りたいのは、パフォーマンス上の理由でそれらを使用することが適切であるかどうかです。つまり、ビジネスソフトウェアではなく、ゲームのコンテキストで使用します。
関数ポインタは高速です。JohnCarmackは、QuakeとDoomのソースコードで悪用される範囲でそれらを使用しました。彼は天才だからです:)
関数ポインタをもっと使いたいのですが、最も適切な場所で使いたいです。
最近、C、C ++、C#、Javaなどの最新のCスタイル言語での関数ポインターの最良かつ最も実用的な使用法は何ですか?