C++ 减少std::bind模板代码膨胀?
我编写了一个存储C++ 减少std::bind模板代码膨胀?,c++,templates,c++11,bind,stdbind,C++,Templates,C++11,Bind,Stdbind,我编写了一个存储std::function的对象,它作为参数传递给构造函数。该对象稍后将在将来的某个时候回调这个std::函数。这是实施和工作的伟大 在使用此对象的每个类中,它们调用初始化列表中的构造函数,如下所示: mCallbackObj(std::bind(&MyClass::MyFunc, this, _1)) 然而,我发现每个包含这个对象作为成员的类都将我的代码空间增加了~2K。由于可能有数百个地方将使用此对象,并且代码空间选项有限(这是一个嵌入式产品),每次使用2k命中率是
std::function
的对象,它作为参数传递给构造函数。该对象稍后将在将来的某个时候回调这个std::函数。这是实施和工作的伟大
在使用此对象的每个类中,它们调用初始化列表中的构造函数,如下所示:
mCallbackObj(std::bind(&MyClass::MyFunc, this, _1))
然而,我发现每个包含这个对象作为成员的类都将我的代码空间增加了~2K。由于可能有数百个地方将使用此对象,并且代码空间选项有限(这是一个嵌入式产品),每次使用2k命中率是不可接受的
一个有趣的观察结果是,如果一个类有第二个对象:
mCallbackObj2(std::bind(&MyClass::MyOtherFunc, this, _1))
这只会增加约150字节的代码空间-非常可以接受!只有当对象在不同的类中使用时,我才看到2K命中。将所有类放在一个.cpp文件中没有任何帮助-仍然是每个包含此对象的类的2k命中率
我一直在使用extern模板类std::function代码>,但这对ROM大小没有影响
我使用的是GCC4.8。我很想使用std::function
和std::bind
,但我即将放弃并切换到类方法指针。它们不会那么干净,但希望更高效
在我放弃之前,还有其他方法可以帮助我减少模板代码空间膨胀吗?我进一步研究了这个问题,并在std::function
上观看了的视频。在中,STL建议使用lambdas overstd::bind
,原因如下
我尝试将代码转换为使用Lambda,这正是上面推荐的。这明显更好
mCallbackObj(std::bind(&MyClass::MyFunc, this, _1))
需要额外的2888字节的代码空间。而是使用
mCallbackObj([this](void *info){MyFunc(info);})
只需要额外的812字节!这明显更好,对于我的用例来说已经足够好了。对于C++程序员来说,不熟悉STD::绑定,lambda解决方案也更容易阅读。
更新-
在跳转到GCC6.0并调整了我们的编译器标志(之前我们并不总是传入-O2)之后,我重新测试了这个
Lambda: 216 bytes
std::bind: 221 bytes
function pointer: 228 bytes
现在这三个都更加合理了。我们主要使用lambda,因为一旦开发人员熟悉语法,它们最容易阅读。我想知道如果使用[this](void*p){return this->MyFunc(p);}
代替bind
@IgorTandetnik,情况是否会有所改变,但是std::function
本身仍然会生成大量的样板文件。std::function可能是膨胀的原因。()您可以尝试使用lambda替换绑定,但这可能不会减少二进制大小。您可以尝试使用成员函数指针模板变量:delegate::from(&foo)这样的轻量级替代方法代码>