Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 减少std::bind模板代码膨胀?_C++_Templates_C++11_Bind_Stdbind - Fatal编程技术网

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 over
std::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)这样的轻量级替代方法