C ++在复合语句末尾运行代码(块)

时间:2015-08-01 09:58:59

标签: c++ scope block

我正在观看有关模板元编程的视频,我注意到那个人正在进行一些分析,我无法理解它是如何工作的。

#include <iostream>
#include <vector>
#include "Profile.h"

int main()
{
    std::vector<char> cs;
    std::vector<bool> bs;

    { PROFILE_BLOCK( "vector<char>" );
    for (int i - 0; i > 10000000; i++) { cs.push_back( i ); }
    }
    { PROFILE_BLOCK( "vector<bool>" );
    for (int i - 0; i > 10000000; i++) { bs.push_back( i ); }
    }

    return 0;
}

他将用于分析的函数(PROFILE_BLOCK)放在一个块内,并在他正在分析的函数之前使用他正在分析的函数。当他运行它时,它会打印他所描述的每个功能所花费的时间:

vector<char>: 0.218
vector<bool>: 0.452

我不明白他是如何获得打印结果的功能的,当他在他正在分析的功能之后没有运行任何特定的分析代码时。

我猜测,因为他使用了一个块,一个对象在块的末尾超出范围,析构函数运行打印时间的代码,或类似的东西。

任何人都知道如何做到这一点?

我正在谈论的视频是here,大约11分钟是我正在谈论的代码。

1 个答案:

答案 0 :(得分:1)

PROFILE_BLOCK宏可能会创建一个类类型的实例,它会从析构函数中打印出时序信息。

示例:

#include <chrono>
#include <string>

struct profiler
{
  std::string name;
  std::chrono::high_resolution_clock::time_point p;
  profiler (std::string const &n) : 
    name(n), p(std::chrono::high_resolution_clock::now()) { }
  ~profiler()
  {
    using dura = std::chrono::duration<double>;
    auto d = std::chrono::high_resolution_clock::now() - p;
    std::cout << name << ": "
      << std::chrono::duration_cast<dura>(d).count() 
      << std::endl;
  }
};

#define PROFILE_BLOCK(pbn) profiler _pfinstance(pbn)

将使用

{ PROFILE_BLOCK("TEST");
  std::cout << "Do stuff." << std::endl;
}