传递函数的缺点?

时间:2011-05-10 20:14:12

标签: c++ class function mutable

我正在学习C ++(来自java)并且最近发现你可以传递函数。这真的很酷,我认为非常有用。现在我正在考虑如何使用它,并且突然出现在我脑海中的一个想法是一个完全可定制的类。

我的列车的最好例子是完全可定制的类(代码),可以说是一个人类。人将拥有与P.有关的所有功能。后来人可以拿起剑(S),所以现在人可以访问与P和S有关的所有功能。

这是否存在限制或性能问题?这是草率的,只是皱起眉头?

任何见解都具有教育意义,谢谢。

〜Aedon

3 个答案:

答案 0 :(得分:4)

当传递函数 - 即指向函数的指针 - 调用总是间接的,因此可能比直接调用慢(并且肯定比内联调用慢)。

STL使用仿函数建模。即:具有调用operator()成员的轻函数对象。这样做的好处是很可能成为内联的候选者,特别是如果函子和operator()非常简单(例如std::less<T>)。

另请参阅:http://www.sgi.com/tech/stl/functors.html

答案 1 :(得分:2)

由于在调用函数之前必须取消引用指针或引用,因此会有轻微的性能损失。

这是一个非常有利的功能。许多设计模式和多态性取决于函数的指针。查看“访客设计模式”。

另一种用法是用于功能表。例如,您可以编写一个通用菜单引擎,通过使用不同的函数显示不同的菜单。

还研究“工厂设计模式”。

答案 2 :(得分:2)

传递一个函数绝对没有错,但它有点原始和限制。除了传递给它的参数之外,通常还有一些要与函数关联的数据。此外,您可能希望将相关功能组合在一起并将其作为一个传递。恭喜,您刚刚描述了一个C ++类!

如果你想看看C ++如何真正模糊这一行,可以考虑一个仿函数。这是一个具有operator()方法的类,因此您可以像调用函数一样调用它。它比普通函数有两个直接优势:它可以在调用之间保持状态,并且编译器可以内联它以获得卓越的性能。例如,std::sort的性能优于较旧的C qsort并不罕见,因为qsort使用函数指针而std::sort使用仿函数。