0

http://www.codeproject.com/KB/cpp/fastdelegate2.aspx成员函数指针 - 只有一个地址?

在上述文章中介绍的第二paragraf它说:“这是由于需要存储所述成员函数和其上的成员函数调用由绑定对象中的昂贵的堆内存分配“。 ..我没有得到这个?它实际上是否需要复制和存储对象和成员函数?它不只是存储成员函数的地址吗?

+0

非静态成员函数与特定对象关联。像'matrix-> Invert()'倒过来一个特定的矩阵,所以它必须知道哪个矩阵操作。 – 2011-04-19 17:38:59

回答

3

Boost.Function比原始函数指针更通用更强大:它们可以存储任何可用特定签名调用的东西。然而,与这种灵活性相关的存储和运行成本是存在的。

的来自Boost.Function文档的Miscellaneous Notes section会谈一点有关这一点,但概括地说:

  • 甲来自Boost.Function对象存储一个成员函数指针和两个数据指针内部。
  • 如果存储大于特定大小的函子,则可能需要堆分配。
  • 调用一个Boost.Function对象会导致通过函数指针调用一个或两个调用,具体取决于存储的内容。

说了这么多,我已经广泛地使用了Boost.Function,并且从来没有在分析时实际显示其存储或运行时成本的情况,所以这是否重要取决于你的实际使用。

0

,只能使用指向该方法的指针才能调用成员函数。原因是因为在上下文中调用方法this),该方法被调用的对象。如果您只有成员函数指针,则无法知道该方法应该应用于哪个对象。但是,如果成员函数是static,那么它确实有而不是有一个上下文,因为可以在不实例化对象的情况下调用静态成员函数。

因此,要调用成员函数,您需要一个指向函数的指针,这个对象定义了对成员函数的调用将发生的上下文的一些对象。

这是回答您的问题吗?

+0

是的有点,但不会引用几乎是一个指向对象的指针?那这就是两个指针?就是这些吗?从我引用的这句话来看,它听起来更像它呢? – 2011-04-20 00:52:23

+0

是的,它就是这样:-)。然而,虽然该方法是一段始终存在的代码(因此指向该方法的指针总是有效的),但存在**对象生命期问题,这些问题会使指向该对象的指针的实现复杂化。有时,您必须创建对象的副本以确保指针保持有效。你想让我用'boost :: function'给你一个完整的例子,或者你可以看看[这个页面](http://www.boost.org/doc/libs/1_46_0/doc/html/function/ tutorial.html)来自官方文档。 – 2011-04-20 07:51:31

+0

嗯..所以有时它会造成那些报价中“昂贵的堆分配”的含义呢?导致为两个指针分配内存不会很昂贵..我已经使用std/boost :: function很多次,所以我知道它是如何完成的。 – 2011-04-23 04:57:21