C++面试之你知道有哪些可执行体吗
作者:二进制架构
可执行体其实也叫可调用对象,这也是面试常常会考到的问题,这篇文章就来和大家详细讲讲C++中的可执行体,感兴趣的小伙伴可以了解一下
某日二师兄参加XXX科技公司的C++工程师开发岗位第14面:
面试官:在C++中,有哪些可执行体?
二师兄:可执行体?
面试官:也就是可调用对象。
二师兄:让我想一想。函数、函数指针、类的静态方法、类的成员方法、仿函数、lambda表达式。
面试官:能说一说他们之间有什么区别吗?
二师兄:好的。函数是一段代码,执行特定任务,接受参数并返回值。
int add(int a, int b) { return a + b; }
二师兄:函数指针是指向函数的指针。
int add(int a, int b) { return a + b; } using addptr = int(*)(int,int); addptr ptr = &add; //函数指针 int sum = addptr(1,2);
二师兄:类的静态方法和函数基本一致,只不过此静态方法属于整个类所有。而成员方法则只能通过类的实例来调用。
class Foo { public: static int add(int a, int b) { return a + b;} //静态方法 int add2(int a, int b) { return a + b; } //成员方法 }; int sum1 = Foo::add(1,2); Foo f; int sum2 = f.add2(2,1);
二师兄:仿函数是一个类或结构体,重载了()
运算符。
struct Add { int operator()(int a, int b) { return a+ b;} }; int sum = Add()(1,2);
二师兄:lambda
表达式在C++11时被引入,本质上是是一个匿名函数。
auto add = [](int a, int b) {return a + b;}; int sum = add(1,2); //or int a =1 , b = 2; auto ladd = [a,b](){return a + b;}; int sum = ladd();
面试官:你知道std::function
?
二师兄:哦,这个标准也是在C++11引入的,它的对象可以把以上所说的可执行体保存起来。
std::function<int(int,int)> add_fun; add_fun = add; add_fun = ptr; add_fun = Foo::add; add_fun =std::bind(&Foo::add2,&f,std::placeholders::_1,std::placeholders::_2); add_fun = Add(); add_fun = ladd;
面试官:那你知道以上可执行体之间的性能有何差别吗?
二师兄:额,性能应该差不多吧。。
面试官:好的,回去等通知吧。
今日二师兄的表现不错,让我们看一下面试官的最后一个问题:
知道以上可执行体之间的性能有何差别吗?
从性能上讲,函数、类的静态/成员方法(非虚方法)、仿函数和lambda
表达式的性能基本相同,而函数指针和std::function
的性能要差一些。因为函数指针和std::function
的实例没有办法被内联。
好了,今日份面试到这里就结束了。 让我们一起期待明天二师兄的表现吧。
到此这篇关于C++面试之你知道有哪些可执行体吗的文章就介绍到这了,更多相关C++可执行体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!