NOIP 考前小复习

发布时间 2023-11-16 21:15:03作者: 浣熊’

考前整理一些可能用得到的东西。

壹:命令行部分

一、编译

  1. -std=c++14

  2. -Wall-Wextra。会提醒一些可能写错了的地方,或者一些比较明显的 UB。比如 for(___)a=___;b=___;,会告诉你循环可能漏掉了末尾;比如 ++x + x++,会告诉你未定义。

    有可能一些习惯,比如压行,会触发警告。这就需要视情况在改代码、带着一串警告编译、隔一会儿一检查里自己选择了。不建议因为这个浪费过多时间。

  3. -fsanitize

    使用: -fanitize=【type】-fanitize=【type1】,【type2】

    例:-fsanitize=undefined

    以下是部分常用的。

    名称 用途
    undefined 未定义
    address 访问越界
    signed-integer-overflow 有符号溢出

    如果触发了会有绚丽的特效,但是也许不一定好使。当个添头,自己一定要多检查检查。

然而你如果全加上的话:


g++ a.cpp -o a -Wall -Wextra -fsanitize=undefined,address,igned-integer-overflow

反正我选择写一份存起来,在关键步骤检测一下。

二、ulimit

目前只有一小部分常用的,其余的以后再说,如果还有以后。

  1. 查看各项限制:ulimit -a

    你可以在里面看到各项的内容、单位、缩写以及当前大小。

    比如 virtual memory 内存,stack size 栈空间

  2. 更改某项限制:ulimit -【type】 【size】

    例如:ulimit -v 512000,将内存限制改为 512000KB。

    对于单个终端窗口,除了第一次以外,每次都只能改小而不能改大。

  3. 常见用法:

    • 由于默认栈空间可能较小,本地测试时有可能爆栈,出现莫名其妙 RE 的情况。据本人统计,此情况一般会带来不小的影响,在比赛时可能很影响心态。

    • 如果开了许东西,但不清楚是否超出限制,可以限制内存大小,如果超限会显示 段错误 或者 Segmentation fault 之类的。注意,正常的超限是在 ./a 之后报错,如果在 g++ 时报错则属于下一条的问题。

  4. 一些重要的小问题

    然而 ulimit 有时不能对内存进行很小的限制,这取决于你的头文件用了多少。

    因为引用头文件是需要空间的,这部分空间同样受 ulimit 限制,如果大小不够就会报一些错误。报错内容似乎和大小有关,这里不深研究。

    另外,这个空间限制并不严谨,在此给出部分本机测试结果。需要注意,这并不是准确的值,连续测试下的结果有所出入,所以一定别卡下界。

    头文件 卡上界 推荐大小
    cstdio 50100 60000
    bits/stdc++.h 189600 200000
    ext/pb_ds/assoc_container.hpp 127590 130000
    bits/extc++.h 240800 250000