zoukankan      html  css  js  c++  java
  • Func和Functor的区别

    Function几乎是任何语言的元素之一,从Pascal,Fortran到C++,VB,几乎任何时代的语言都支持它。在C++里,随着 C++标准库的推出,人们开始渐渐的接触到另一种定义函数的方式:Functor。所谓Functor,其实就是重载了operator () 的类,其使用方式和普通函数差不多(这正是C++处处体现的一种思想:只在定义上有区别,在使用上毫无区别)。
      譬如说,如果我们要定义一个函数,将传入的整型引用加一,我们可以有两种方法定义:
    inline void increase_one_func(int& i)
    {
      ++i;
    }
    class increase_one_functor
    {
    public:
      void operator()(int& i)
      {
        ++i;
      }
    }
    increase_one_functor;
    使用起来则没什么区别:
    int i=0;
    increase_one_func(i);
    increase_one_functor(i);

      那Function和Functor到底有什么区别呢?其实他们定义方式的区别已经决定了他们使用上的区别了。

      首先,Functor相比Function来说,可以传递更多的信息:
    因为Functor是以类的方式存在的,它可以包含任意多的信息。除了传入参数以外,你还可以在类内预设一些其它的信息。
    譬如说,下面这个Functor:
    class increase_one_functor
    {
      int mIncrement;
    public:
      increase_one_functor(int increment=1):mIncrement(increment)
      {}
      void operator()(int& i)
      {
        ++i;
      }
    }
      可以很方便的实现将一个整数增加任意值的功能:
    increase_one_functor(100)(i);// 将i加100。
      而Function就很难实现这样的可扩展性。

      其次,在作为参数传递时,Functor的效率往往比Function要高。这是因为,在把Functor作为参数传递时,你实际上传递的是 Functor对象,在整个编译过程中,编译器始终知道它所在处理的Functor对象是哪个Functor类的,也就是说,它可以做编译时的优化。而对 于Function来说,它往往以指针的方式传递,对于编译器来说,很难做(并不是不可能)编译时的优化。
      下面这段程序或许可以说明问题:
    #include <windows.h>
    #include <iostream>

    using namespace std;

    inline void increase_one_func(int& i)
    {
      ++i;
    }

    class increase_one_functor
    {
    public:
      void operator()(int& i)
      {
        ++i;
      }
    }
    increase_one_functor;

    const int VECTOR_SIZE=1024*16;

    void treat_vector_func(int ai[VECTOR_SIZE],void (*func)(int& i))
    {
      for(int i=0;i<VECTOR_SIZE;++i)
        func(ai[i]);
    }

    template<typename T>
    void treat_vector_func(int ai[VECTOR_SIZE],T functor)
    {
      for(int i=0;i<VECTOR_SIZE;++i)
        functor(ai[i]);
    }

    void main(void)
    {
      static int ai[VECTOR_SIZE];
      const int CALL_TIMES=10240;
      {
        long l=GetTickCount();
        for(int i=0;i<CALL_TIMES;++i)
          treat_vector_func(ai,increase_one_func);
        l=GetTickCount()-l;
        cerr<<"function "<<l<<endl;
      }
      {
        long l=GetTickCount();
        for(int i=0;i<CALL_TIMES;++i)
          treat_vector_func(ai,increase_one_functor);
        l=GetTickCount()-l;
        cerr<<"functor "<<l<<endl;
      }
    }
      运行结果如下:
    Debug模式下(也就是说,没有任何优化的情况下):
    function 37623
    functor 36825
    Release模式下:
    function 4573
    functor 1726
      可见,functor比function要快很多。这个不知道是是不是啊.....,有机会试试

  • 相关阅读:
    hdu--1231--并查集<连分量的个数>
    hdu--1272--并查集||图的特点
    hdu--1856--并查集的离散化处理
    hdu--1285 && 4857 --正向 || 逆向拓扑排序 && 优先队列
    hdu--1671--字典树<出现mle怎么解决>
    CF260--C--dp<最大不连续子序列和>
    Hibernate之级联关系配置的作用
    调用JS的方法
    Hibernate映射关系之多对多
    Hibernate映射关系之一对多
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/2741822.html
Copyright © 2011-2022 走看看