说起 C++,想必大家都做过 C++ 的题,也碰到过 TLE1、MLE2、RE3等情况,部分原因是因为代码太复杂,导致超时,爆空间等
下面,笔者就来分享一些C++的代码优化
1. sync_with_stdio(false)
想必大家都用过 iostream,Hello, World! 那题,大家用的不是printf
就是cout
而 sync_with_stdio 这个开关可以做一些优化
#include <iostream>
int main() {
std::ios::sync_with_stdio(false);
std::cout << "Hello, World!" << std::endl;
return 0;
}
sync_with_stdio(bool turnc);
,其中 turnc 默认为 true,如果 turnc 为 true,就会把 C 里的 scanf / printf 与 C++ 的 cin / cout 的文件指针自动同步,但是由于我们一般使用时没必要时刻都同步,就可以关掉它,并不影响输入输出,相反还会大幅提高 cin / cout 的效率
那效率到底能提高多少呢?
经测试,没有关掉前,cout 用的时间是 printf 的几倍之多
而关掉后,甚至比 printf 还要快些 😮
2. 不使用 IO 流
这个就更狠了,cin / cout 不是效率低吗,我不用 iostream,直接用 cstdio
#include <cstdio>
int main() {
puts("Hello, World!");
return 0;
}
3. 少用 for 循环和 while(do-while)循环,if-goto,switch-case等,避免死循环
大家都知道,循环是 C++ 的一种重复执行代码的方法
但大量的循环会导致程序效率低下
众所周知,电脑1秒钟可以做几十万亿次运算,有人就觉得:既然可以做那么多运算,循环这点次数又算什么
可是你别忘了,你的程序在评测时,可是要先开虚拟机,再复制代码,调用编译器后运行,电脑那么多内部运算,你的程序又能被运算多少次?
死循环4就更应避免了,要知道死循环会无穷无尽循环下去,永远停不下(除非在程序里用break或关闭程序),所以 TLE1 是肯定的
4. 不开巨大的数组
我有一个朋友,他在做题时,开了3个bool[10010][10010]
,结果 MLE2 了
所以开大数组也是编程之大忌
5. 不过多地使用函数
函数,想必大家都知道,这样的形式
返回类型 函数名(形参列表) {
带有return函数体(除非返回类型为void)
}
而在调用函数时,会耗费很多时间,程序要进行参数压栈、弹栈、取址(取地址)、取值(根据地址取值)等操作
你不要说用内联函数就ok了
内联函数虽然不会进行压栈、弹栈的过程,但是它浪费空间
而且你还不知道编译器会不会听从建议,声明/定义为内联
如果你真需要调用,不妨试试以下几种
1. 仿函数 functor
class 函数名 {
public:
返回类型 operator()(形参表) {
函数体
}
};
调用这种重载运算符时,往往比函数效率更高(具体为什么笔者也不知道,百度去,链接:http://www.baidu.com/)
2. 预处理宏 macro
#define 函数名(参数列表) 函数体(用\换行,参数要用括号括起来)
这个还用说吗,就是简单的替换
以上就是 C++优化代码的方法了,请觉得不错和有帮助的朋友们动动鼠标点个赞再走吧,谢谢🤝