网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月26日漏签0天
noip吧 关注:25,167贴子:642,087
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 21回复贴,共1页
<<返回noip吧
>0< 加载中...

【引战】OI(特别是中国的竞赛)做多了养成的写代码的坏习惯

  • 只看楼主
  • 收藏

  • 回复
  • zalazan
  • 怒进省队
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
此处的坏习惯,指的是以后在大型软件项目中写出糟糕代码的现象。毕竟OI竞赛就是高中几年(顶多加上大学ACM)的事,而开发大型项目的能力则是漫长的职业生涯非常重要的素质,所以我在此处列出几个我常见的糟糕代码例子(包括有些我自己以前也经常做的),以及不少的(对某项语言特性的)迷信。
此外,我还觉得,中国的OI竞赛因为各种非技术原因的奇葩规定(例如禁用STL,不开优化,不给用C++11),导致形成了了一些独有的坏习惯
在喷我之前,请确保你是在使用<b>现代的</b>语言(例如最新标准的C/C++,pascal就不要提了),和编译器(以及IDE,例如恐龙级的borland系列也不要提了),而且我说这些,都是面向企业大型项目的开发而言,在竞赛中也许用了会有较好的结果,但是在工作中这样写代码,在大公司早就被炒了。
另外,不看汇编输出谈优化都是耍流氓!想有效地优化得要先学编译原理和cpu架构
1. 异或交换两个数字。经典奇技淫巧。如果学过编译原理就知道这毫无意义(Copy Propagation)
2.使用register关键字。现代编译器里这个关键字直接忽略(对,完全没有作用)(C++17终于取消这个关键字了)。类似的还有对inline关键字的迷信和误用。 相反的,真正有可能产生优化效果的const &和static却不会用(static某些情况可以减少生成程序大小)
3.纠结++i,i++,i+=1的性能。为什么不反汇编一下呢?你重载++操作符另外说(而且这样也是非常糟糕的编程风格)
4.自己写基本数学函数,例如abs,max,min之类。十条汇编指令内的东西,基本上没几个人类能够写得好过编译器,所以不要浪费时间了。想做微优化,起码都得从矩阵乘法这种复杂度起步,而且凡是libc有的数学函数,都基本上优化得比你好了。用define的更加不能容忍
5.把几个有副作用的表达式放在同一语句。例如i=i+++++i之类的,不知道是不是受到谭浩强影响,这种未定义行为还有这么多人热衷。(如果你会编译原理,并且熟悉gcc的架构,你的确能够预测会发生什么,但是这样的东西你真好意思写出来?)
6.忽略I/O,内存缓存hit rate,分支预判准确率。这些通常才是真正瓶颈,特别是I/O,例如你要读1000个文件的元信息,并且按大小排序,结果你还纠结应该用哪种排序算法,这就是2B
7.自己维护指针来进行数组读取,例如int* ptr = &a[0] 然后自己*ptr++。64位汇编有专门的内存写法来处理数组,例如 (%rbp, %rax, 4)这样的,自己维护指针只会增加代码混乱度
8.认为开O3会导致不稳定。这纯属人云亦云
9.无理恐惧C++的异常,多态和模版。这里水太深,不多说。总之用现代的编译器,C++异常只要不抛出,那么就没有性能问题。
后面想到了补充


  • _lwher
  • IOI铜牌
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如果我没记错的话,stl是不禁用的,今年的noi也开了o2了


2025-07-26 12:35:07
广告
不感兴趣
开通SVIP免广告
  • RAFFICA
  • 省选酱油
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
i=i+++++i 我是辣鸡 读不懂这程序


  • 灰天飞雁
  • 进队爷
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1-5即使在OI里这么写也要被打的…
6 那些玩意对OI比赛来说真的不是瓶颈…实际工程中忽略了就是奇葩了
7 主要是为了写的快吧…
8 4.x gcc的O3 bug真不少。。而且很多竞赛代码都不合规范O3容易炸
9 不是恐惧。。写的慢而已…
值得吐槽的不是算法竞赛,是认为算法是全部的观点


  • 灰天飞雁
  • 进队爷
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
STL最主要是历史与平衡性的问题吧…现在也开了…话说工作中也有因为非技术因素不用STL的情况…


  • 炽月殿
  • NOI金牌
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
qwq


  • lkmcfj
  • 省选酱油
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
算法竞赛中很多习惯如果放到工程里确实很糟糕,但这是竞赛并不是工业啊……还有stl早就可以用了
再说竞赛主要考的是算法,计算机底层的知识很重要但不在考察范围内啊
还有在竞赛里算法复杂度当然是瓶颈……卡读入的出题人应该被烧死(逃


  • ¤工藤星一※
  • 求过初赛
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
pas党表示136看不懂
还是python大法好,嗯。


2025-07-26 12:29:07
广告
不感兴趣
开通SVIP免广告
  • 神座流出
  • 初识程序
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
挖个坟……
常引用问题在 C++ 还好,至少有人提。当年我用 Pascal 竞赛时几乎没见过人用 const 修饰参数(当传入参数较大时传引用,较小时传值)……不知道现在怎么样了。


  • 神座流出
  • 初识程序
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
另外有一些风格让我感到不舒服。
很多代码风格简直是畏惧换行,不知道是出于什么心态……
无关的内容…在某个大牛博客里看到了类似这样的古风写法
void SegInsert(x, l, r) S*x, int l, r {/*......*/}
(C 草创期的东西,然而因为兼容性还没被标准干掉)
Pascal 有一些适合竞赛的比较新的语法,但似乎用的人很少。(这个不用在意,反正以后也用不上了)


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 21回复贴,共1页
<<返回noip吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示