【发布时间】:2012-09-29 16:33:22
【问题描述】:
我的问题涉及 C++ 中函数包装器的内联优化应用,请考虑以下代码,WorkerStructure 对象是使用封装了一些功能块的函数包装器初始化的。然后在调用 WorkerStructure::doSomeWork 方法时使用函数包装器。
workerFunction对象封装的功能在WorkerStructure::doSomeWork方法上应用时会内联吗?显然如果功能定义在其他翻译单元中,workerFunction对象只封装了一个函数指针,有吗任何其他无法内联的情况?
当通过函数包装器传递在不同翻译单元中定义的 lambda 函数时,它是否等效于传递函数指针?
struct WorkerStructure
{
WorkerStructure(std::function <bool(float)> &f):workerFunction(f) {}
void doSomeWork(float inputValue)
{
if(workerFunction(inputValue))
{
//do some conditional operation
}
}
std::function <bool(float)> workerFunction ;
};
【问题讨论】:
-
这在很大程度上取决于编译器和优化标志。仅供参考,最近的 GCC(即 4.7)具有链接时优化能力(编译 和 链接与
gcc -flto -O2) -
酷!,不知道 flto,我正在尝试很多 lambda 函数,我真的很喜欢他们给我的灵活性,但我不愿意接受任何性能下降,因此问题.
-
我最近将我的大部分代码切换到在 gcc 4.7.0 中使用 lambda,而没有遇到性能损失(我基本上替换了
for()在一些自酿的类似迭代器的对象上循环以访问复杂的带有for_each_obj(lambda)的数据结构,其中for_each_obj模板由数据结构提供,可以更好地优化循环逻辑)。 -
但是,使用 lambdas 当然,不意味着使用
std::function。后者很可能会导致性能下降。
标签: c++ optimization c++11 inlining