2011-07-18 2 views
0

学問的な問題として、バインドテンプレート(boost :: lambdaのesp)を使用してライニングを防止していますか?もしそうなら、宣言されたファンクタを使用する以外に、ライニングを防止しないboost :: lambda形式がありますか? (そして、特に最新のgccで)boost :: lambda :: bind式はインライニングを防ぎますか/そうでない代替フォームはありますか?

namespace bll = boost::lambda; 

class MyItem 
{ 
    public: 
     float attribute() { return 4; } 
} 

struct AttributeLessConst 
{ 
    AttributeLess(float value_a) : value(value_a) {} 
    bool operator()(const MyItem & a) 
    { 
     return a.attribute() < value; 
    }; 

    const float value; 
} 

std::list<MyItem> myList; 

remove_if_seq(myList, AttributeLessConst(1.5));  // in-linable // yes 
remove_if_seq(myList, bll::bind(&MyItem::attribute, *bll::_1) < 1.5); // yes? 

答えて

2

いいえ、高度なコンパイラの技術を除いては、インライン化を防ぎません。 Boost.Lambdaは、使用する理由がないタイプ消去を行う場合を除き、手書きコードと同じくらい簡単に静的に検査することができます。 Boost.Lambda documentationの関連するスニペットは、図書館がこの約束を果たすことを示唆しています。

*:および/またはランタイムテクノロジは、プログラムだけではなく、共有ライブラリ、動的にロードされるモジュールです。

+0

しかし、ドキュメントは関数ポインタを使用しない非常に簡単な例を使用しています。 – Catskul

+0

@Catskul私のGCCのコピーは、必ずしもそうではないが、関数ポインタの存在下でインライン化することができる。正確に何を期待していますか? –