2011-07-18 25 views
0

作爲學術興趣的問題,是否使用綁定模板(尤其是在boost :: lambda中)防止內聯?如果是這樣,除了使用聲明的函數外,是否有一個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副本可以內聯函數指針,但並非總是如此。你期望什麼? –

相關問題