C++之常用的优化

2 篇文章 0 订阅

说起 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++优化代码的方法了,请觉得不错和有帮助的朋友们动动鼠标点个赞再走吧,谢谢🤝


  1. 即 Time Limit Exceeded,超过时间限制 ↩︎ ↩︎

  2. 即 Memory Limit Exceeded,超过空间限制 ↩︎ ↩︎

  3. 即 Runtime Error,指程序在运行期间崩溃(编译可以通过) ↩︎

  4. 指由于条件永远为 true 而进行的永无休止的循环,例如 while(1) {}while(true) {}for(;;) {} ↩︎

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jcShan709

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值