6

私は C++11 で小さな数学的最適化フレームワークに取り組んでいます。ユーザーがドメイン固有のロジックを提供するための最良の方法は何だろうと思います。フレームワークから呼び出すことができるフック メソッドを使用してクラスを定義するよう彼女に強制することもできますが、私はフレームワークをスリムに保ち、できる限り新しい C++11 機能を活用したいと考えています。そこでstd::function、おそらくラムダ式からインスタンス化されたオブジェクトをパラメーターとして受け入れ、必要に応じて呼び出すことを考えています。私が疑問に思っている唯一のことは、コンパイラ (私の場合は gcc ですが、Xcode と Visual C++ についても知りたいです) が std::function オブジェクトを取り、関数定義をインライン化できるかどうかです。コードの残りの部分と一緒に最適化されるようにします。

PS: コメントから、私の質問の最初のリビジョンはほとんどのユーザーにとって不明瞭だったようです。おそらく、間違った言語を使用した私のせいです。ここで伝えようとしている概念を誰かが理解してくれることを願っています (そしておそらく解決策を提案します)。

PPS: 誰かがテンプレートの使用を提案しました。これは私が考えたアイデアですが、代替案があるかどうか知りたいです。テンプレートに反対するものは何もありませんが、動的オブジェクトの観点から推論する方が簡単であるため、これが機能するようになり次第、テンプレート ベースのバージョンを作成する予定です。

4

1 に答える 1

8

std::function任意の呼び出し可能オブジェクトを格納できる呼び出し可能オブジェクトです。設計上、可能な限り柔軟です。ただし、その設計には欠点があります。functions にはほとんど何でも (callable) 含めることができるため、何でも操作できる必要があります

内部的にfunctionは、コンパイル時に何が格納されているかわかりません。この決定は実行時に行われるため、ほとんどの通常のコンパイラがそれをインライン化することはほとんど不可能です。関数ポインターを介したインライン化は可能ですが、そのポインターの値が何であるかがローカルでわかっている場合に限ります。function単なる関数ポインタよりもはるかに複雑です。

functionそのようなものをインライン化することは理論的には可能ですが、コードの繰り返し実行により、特定のオブジェクトが常に特定のコンテンツで使用されることを決定できる、ある種のプロファイルに基づく最適化システムの一部としてのみ可能であり、したがってそれらをインライン化します。でもそれさえも

任意の呼び出し可能なオブジェクトをインライン化する場合は、 ではなくテンプレート関数を使用する必要がありますstd::functionテンプレートを使用できないfunction場合(おそらく、複数の関数をコンテナーに格納する必要があるため、またはカプセル化を破りたくないためなど)、それでも任意の callable を格納する必要がある場合に使用します。

于 2013-05-24T10:49:05.897 に答える