7

我正在为动态加载的库实现一个独立于平台的包装器。当然,当我从库中加载函数时,我需要将它们存储为指针以备将来使用。我想过为此使用 boost::function 而不是普通的函数指针。当然,这会增加编译时间,但这不是我害怕的。相当:

调用存储函数时 boost::function 引入的开销是多少?有吗?它有多大?

我想我在不时调用此类函数时不会有太多开销,但是,经常调用的函数呢?(极端示例,glVertex在加载的 GL 库上)。对性能有多大影响?

Source-diving boost 没有给出太多答案:>。

此外,如果它依赖于编译器,我主要对 GCC 和 MSVC 感兴趣。

4

2 回答 2

5

如 Boost文档中所述,在大多数情况下,调用 aboost::function会导致通过函数指针进行一次调用。换句话说,如果你无论如何都必须使用函数指针,那就是洗礼了,你可以免费获得一堆增强的功能。

于 2010-01-02T00:13:41.193 回答
1

boost::function 进入了 tr1,所以它在现代编译器上是 std::tr1::function,而在真正现代编译器上只是 std::function。

在任何情况下,正如您所观察到的, std::function 的创建开销非零(包括创建对象的副本)。理论上,它应该与调用的原始函数指针具有相同的开销;即有一个间接级别——但真正聪明的编译器可以内联该级别的间接。

当然,您可以将某些东西存储在 std::function 中,而这些东西无法适应或存储在函数指针中。

于 2010-01-02T00:14:23.143 回答