【问题标题】:Disadvantages of passing around functions?传递函数的缺点?
【发布时间】:2011-08-22 18:58:08
【问题描述】:

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

我对完全可定制的类(代码)的训练中最好的例子就是一个人类。 Person 将拥有与 P 相关的所有功能。后来 Person 可能会拿起剑 (S),所以现在 Person 可以访问与 P 和 S 相关的所有功能。

这是否存在限制或性能问题?这是不是很草率,只是不屑一顾?

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

~艾顿

【问题讨论】:

  • FWIW:在 Java 中,通过传递具有给定主格类型的对象来模拟同样的事情。例如,一个线程可以传递一个可运行的“函数”(嗯,一个只有一个“运行”方法的对象的实例)。 C# 和 Scala 等语言隐藏了这一细节(但仍将函数作为对象传递给糖)。
  • 然而,在 java 中,您必须将定义硬编码到类中(当然,您也可以即时修改类,但如果我使用新代码,则必须重新编译才能使用'我没有弄错)。您不能只将函数变量传递给类并在 C++ 中执行该函数吗?无需硬编码...我猜是类型?
  • 你可以做到。你应该这样做吗?几乎总是没有。诀窍是知道什么时候应该这样做。
  • 你能告诉我为什么吗?只是形式不好?
  • @AedonEtLIRA 类的定义必须是硬编码的,就像函数的定义必须是硬编码的一样(不包括“魔术”运行时生成)。否则,两者都可以视为(不同种类的)对象并且都是可分配的。

标签: c++ class function mutable


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我会研究仿函数的。
【解决方案2】:

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

STL 是用函子建模的。即:具有被调用的 operator() 成员的轻量级函数对象。这样做的好处是很可能是内联的候选对象,尤其是在函子和operator() 非常简单的情况下(例如std::less<T>)。

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

【讨论】:

  • 谢谢,我会看看这个链接。
【解决方案3】:

由于在调用函数之前必须取消引用指针或引用,因此对性能有轻微影响。

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

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

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

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2015-10-12
    • 2018-03-28
    相关资源
    最近更新 更多