如果知道我会死在哪里,那我将永远不去那个地方 ——查理 芒格
提示
如下为真实面试环节的对话,可以先不看最后的解答,自己想想该如何回答该问题。
我
C 智能指针的根本思想是什么
这个还真没有研究过,不清楚
被面试者
我
那我换一个问题吧,我有一个耗时函数,需要统计耗时该如何做
在函数的开始位置记录下当前时刻,在函数的结尾处再次记录下当前时刻,两者做差即为函数耗时。
被面试者
我
如果这个函数有很多return语句,并且我也不知道函数从哪里返回,又该如何做
使用goto语句,修改每个return语句为goto,使其走到指定位置,计算退出前的函数
被面试者
我
那如果有100个return,便需要修改100个位置呀,如果遗漏一个便统计遗漏
那我还想不到了
被面试者
我
可以通过自定义类或函数的形式,你可以再想想。
被面试者思考良久没有结果,由于时间关系,我便讲了出来。也希望他能够在这个面试环节能够学到一点东西。
谁人不是面试官,谁人又何尝不是被面试者呢,将人问倒、炫耀自己的技术有多么NB从来不是目的,了解被面试者的知识面和知识深度,并进行岗位匹配才是这场面试的目的,如果能够相互学习点东西那简直是再好不过了。
如果函数有100个return,如何求函数耗时
其实就是定义一个类,在构造函数中函数中记录下当前时刻的时间,在析构函数内再次记录当前时刻,两个时间的差值就可以计算出耗时。如果该类的对象定义在函数的起始位置,那统计的就是函数的耗时。代码见后。
有人会说,这和智能指针的根本思想有什么关系呢。起始两者是同一个思想——RAII(Resource Acquisition Is Initialization),它是一种设计思想,即将资源的获取放在类的构造函数里,将资源的释放放在类的析构函数里。当对象的生命周期结束时,析构函数会自动被调用,相应的资源也会被自动释放。
代码语言:javascript复制#include <chrono>
#include<string>
class TimeCounter
{
public:
TimeCounter(std::string name):m_name(name){
m_start = std::chrono::high_resolution_clock::now();
};
~TimeCounter(){
auto stop = std::chrono::high_resolution_clock::now();
auto dur = std::chrono::duration_cast<std::chrono::microseconds>(stop-m_start);
auto dur_us = dur.count();
std::cout<<"current object "<<m_name<<" exist time (us)"<<dur_us;
}
TimeCounter operator=(const TimeCounter&)=delete;
TimeCounter(const TimeCounter& )=delete;
TimeCounter operator=(const TimeCounter&&) = delete;
TimeCounter(const TimeCounter&&) = delete;
private:
std::string m_name{""};
std::chrono::high_resolution_clock::time_point m_start;
};
void test_time_cost()
{
TimeCounter tc1("function_test");
int j =100;
auto tc2 = std::make_shared<TimeCounter>("long_time_process");
/*
long time process
*/
tc2.reset();
}