C の std::function と関数ポインター : 最良の選択を行う
C では、コールバック関数を実装するときに、多くの場合、選択が重要になります。 C スタイルの関数ポインターを使用するか std::function を使用するかの間で発生します。どちらのアプローチにも長所と短所がありますが、ほとんどの場合、std::function の方が良いオプションです。
関数ポインター: 制限された機能
関数ポインター (例を参照)次のコードには基本的な制限があります:
void (*callbackFunc)(int);
コンテキスト変数をキャプチャできないため、渡すことができません。このような変数に依存するラムダ関数、または非静的オブジェクト データ メンバーを呼び出すラムダ関数。
std::function: 多用途かつ効率的
対照的に、std::function ( C 11) で導入された機能により、任意の型の関数の保存と使用が可能になります。これには次の利点があります:
テンプレート パラメータ: 代替
場合によっては、テンプレート パラメータを 呼び出し可能なオブジェクト として使用すると、有益。これにより、呼び出し可能なオブジェクト (関数ポインター、ファンクター、ラムダ、std::function など) をパラメーターとして渡すことができます。ただし、いくつかの欠点があります。
比較の概要
次の表は、各アプローチの長所と短所を比較しています。
Feature | Function Pointer | std::function | Template Parameter |
---|---|---|---|
Context variable capture | No¹ | Yes | Yes |
Call overhead | No | No | Yes |
Inlining potential | No | No | Yes |
Class member storage | Yes | Yes | No² |
Header implementation | Yes | Yes | No |
C 11 support | Yes | No³ | Yes |
Readability | No | Yes | (Yes) |
結論
要約すると、C でコールバック関数を実装するには、汎用性、利便性、最小限のオーバーヘッドを提供する std::function が一般的に推奨される選択肢です。関数ポインタは、ヘッダーのない実装や厳しいパフォーマンス要件がある場合など、特定のニーズに引き続き役立ちます。柔軟性が優先される場合は、テンプレート パラメーターを呼び出し可能なオブジェクトとして考慮することが実行可能なオプションになる可能性があります。
以上がstd::function と関数ポインタ: それぞれを選択する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。