这才是面试官想听到的答案,C++er必须得看看

2024-07-18 13:12:20 浏览数 (2)

如果知道我会死在哪里,那我将永远不去那个地方 ——查理 芒格

提示

如下为真实面试环节的对话,可以先不看最后的解答,自己想想该如何回答该问题。

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();
}

0 人点赞