boost :: lambda :: bind表达式是否会阻止in-lining /是否存在另一种形式?

时间:2011-07-18 17:58:49

标签: c++ optimization boost lambda functor

作为学术兴趣,使用绑定模板(特别是boost :: lambda)会阻止内嵌吗?如果是这样,除了使用声明的仿函数之外,还有一个不会阻止内嵌的boost :: lambda形式吗? (特别是在最新的gcc中)

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?

1 个答案:

答案 0 :(得分:2)

没有。除了高级编译器*技术之外,没有什么可以阻止内联。除非Boost.Lambda使用它没有理由使用的类型擦除,否则它所做的一切都可以像手写代码一样简单地进行检查。 Boost.Lambda documentation中的相关片段表明图书馆实现了这一承诺。

*:和/或运行时技术不仅考虑程序而且考虑例如共享库和动态加载的模块。