6

このコードを試すまでは、Boost.Phoenix は型推論を使用してすべてを静的に推論するといつも思っていました。

#include <vector>
#include <boost/phoenix/phoenix.hpp>

using namespace boost::phoenix;
using namespace boost::phoenix::placeholders;

struct Foo { int x; };

int main()
{
    std::vector<int> bar;
    bind(&Foo::x, ref(bar)[_1])("invalid index");   // oops
    return 0;
}

そして警告を受けました:

警告 C4239: 非標準の拡張子が使用されています: 'argument': からconst char [3]volatile const boost::proto::detail::anyns::any &
の変換 非定数参照は左辺値にのみバインドできます

それは私を驚かせました。anyどこにも見られるとは思っていませんでしたvolatile

つまり、Boost.Phoenix は実際には同等の C++11 ラムダより本質的に遅いということですか (ここで使用している特定のコンパイラは無視します)。

4

2 に答える 2

2

そうではなくBoost.Any、実装の詳細anyからですBoost.Proto-を参照してくださいboost/proto/detail/decltype.hpp。実行時のオーバーヘッドはゼロです。

于 2012-07-22T13:22:14.837 に答える
0

Boost.Phoenix は同等の C++11 ラムダよりも遅いと思います。関数は、後で呼び出す関数のbindアドレスを取得するため、必要な関数を直接呼び出すラムダが使用された場合よりも、コンパイラは結果の関数呼び出しをインライン化するのにはるかに苦労します。

ここで言及しているオーバーヘッドは、関数への間接呼び出しのオーバーヘッドです。十分にスマートなコンパイラはそれを削除できますが、Boost.Phoenix に対して実際にこれを行うコンパイラがあるかどうかはわかりません。

于 2013-02-28T05:55:03.117 に答える