考前整理一些可能用得到的东西。
壹:命令行部分
一、编译
-
-std=c++14
。 -
-Wall
,-Wextra
。会提醒一些可能写错了的地方,或者一些比较明显的 UB。比如for(___)a=___;b=___;
,会告诉你循环可能漏掉了末尾;比如++x + x++
,会告诉你未定义。有可能一些习惯,比如压行,会触发警告。这就需要视情况在改代码、带着一串警告编译、隔一会儿一检查里自己选择了。不建议因为这个浪费过多时间。
-
-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
目前只有一小部分常用的,其余的以后再说,如果还有以后。
-
查看各项限制:
ulimit -a
你可以在里面看到各项的内容、单位、缩写以及当前大小。
比如
virtual memory
内存,stack size
栈空间 -
更改某项限制:
ulimit -【type】 【size】
例如:
ulimit -v 512000
,将内存限制改为 512000KB。对于单个终端窗口,除了第一次以外,每次都只能改小而不能改大。
-
常见用法:
-
由于默认栈空间可能较小,本地测试时有可能爆栈,出现莫名其妙 RE 的情况。据本人统计,此情况一般会带来不小的影响,在比赛时可能很影响心态。
-
如果开了许东西,但不清楚是否超出限制,可以限制内存大小,如果超限会显示
段错误
或者Segmentation fault
之类的。注意,正常的超限是在./a
之后报错,如果在g++
时报错则属于下一条的问题。
-
-
一些重要的小问题
然而 ulimit 有时不能对内存进行很小的限制,这取决于你的头文件用了多少。
因为引用头文件是需要空间的,这部分空间同样受
ulimit
限制,如果大小不够就会报一些错误。报错内容似乎和大小有关,这里不深研究。另外,这个空间限制并不严谨,在此给出部分本机测试结果。需要注意,这并不是准确的值,连续测试下的结果有所出入,所以一定别卡下界。
头文件 卡上界 推荐大小 cstdio
50100 60000 bits/stdc++.h
189600 200000 ext/pb_ds/assoc_container.hpp
127590 130000 bits/extc++.h
240800 250000