Skip to main content

__debug's Home Keep it simple, stupid

[OI in C++] OI 比赛中常用的 C++ 技巧

姊妹篇: OI in Linux

注意这里介绍的技巧仅限于 OI 比赛.

默认环境是 Linux, 编译器 g++.

有用的编译选项

  • -Wall: 这个就不用说了吧……
  • -Wextra: 同上
  • -Wshadow: 如果局部变量和另一个局部变量重名将会警告
  • -pendentic: 如果代码不符合 C++ 标准将会警告 (比赛时慎用)
  • -Winline: inline 失败将会警告. 不建议在平时开启 (因为如果对递归函数 inline, 此警告将会刷屏)

有用的函数

获取程序占用内存

#include <iostream>
#include <fstream>
#include <string>

std::string procStatus()
{
    std::ifstream t("/proc/self/status");
    return std::string(std::istreambuf_iterator<char>(t), std::istreambuf_iterator<char>());
}

在程序末尾调用. 原理就是把 /proc/self/status 原样输出, 其中 VmPeak 字段即为占用内存的最高峰. 当然你也可以用 fread 去搞.

性能分析(卡常利器)

首先在编译时加入 -pg 选项, 然后运行该程序.

程序会跑得很慢, 同时目录下会产生一个 gmon.out.

等程序跑完了之后, 运行命令 gprof program_name > result.txt.

现在 result.txt 中包含了每个函数详尽的调用次数/时间/占总时间百分比等, 是不可多得的卡常利器.

最重要的一点, 比赛时也可以用.

GNU 扩展

包括 ropepb_ds 库里的众多黑科技.

待填.

Comments

Comments powered by Disqus