博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Func和Functor的区别
阅读量:5093 次
发布时间:2019-06-13

本文共 2232 字,大约阅读时间需要 7 分钟。

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要快很多。这个不知道是是不是啊.....,有机会试试

转载于:https://www.cnblogs.com/dongzhiquan/archive/2012/10/26/2741822.html

你可能感兴趣的文章
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>
[13年迁移]Firefox下margin-top问题
查看>>
Zookeeper常用命令 (转)
查看>>
Enterprise Library - Data Access Application Block 6.0.1304
查看>>
重构代码 —— 函数即变量(Replace temp with Query)
查看>>
Bootstrap栅格学习
查看>>
程序员的数学
查看>>
聚合与组合
查看>>
如何理解汉诺塔
查看>>
洛谷 P2089 烤鸡【DFS递归/10重枚举】
查看>>
Linux基本操作
查看>>