【发布时间】:2016-04-14 08:17:54
【问题描述】:
This answer 声明std::bind 按值返回对象,this comment 暗示分配给std::function 将导致堆分配存储std::bind 返回的值。
有没有办法避免这种堆分配,将std::bind的返回值直接按值传递给另一个函数?
如果是这样,方法签名会用什么替换std::function?
更明确地说,我有一个类似下面的函数。
void runThisFunction(std::function<void()> func);
假设有一个具有以下签名的函数foo。
void foo(int a, int b);
现在,我将调用runThisFunction,如下所示。
runThisFunction(std::bind(foo, 1, 2));
在此调用中,std::bind 的输出被转换为 std::function,并且动态内存分配是此过程的一部分。
是否可以将std::function 替换为将直接按值接收std::bind 输出的其他声明,从而避免动态内存分配?
【问题讨论】:
-
template <class T> void runThisFunction(T func)算不算? -
@PiotrSkotnicki,感觉它可能会起作用。它确实遇到了模板的常见问题(为每种类型生成一个代码副本),但我想它无济于事。
-
不知道为什么这个问题被否决了。我根本没有想到使用模板来解决这个问题,尽管事后看来很明显。
-
如果您不喜欢模板,并且调用者的变化不足以真正需要它们,您可以尝试
void runThisFunction(decltype(std::bind(foo, 1, 2))& func);- 我怀疑您可以使用任何@987654339 调用它@ 调用,其中参数的静态类型匹配foo、1和2,但您必须深入研究标准以查看是否有保证。 -
你多久运行一次这个函数?相当于每帧每像素或类似? (比如几百万次/秒?)
标签: c++ c++11 std-function stdbind