某日二師兄參加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
的實體沒有辦法被行內,
好了,今日份面試到這里就結束了, 讓我們一起期待明天二師兄的表現吧,
關注我,帶你21天“精通”C++!(狗頭)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555188.html
標籤:其他
上一篇:Set 介面及其常用方法
下一篇:返回列表