不同编译器对于等号左右两侧执行顺序及简单IO优化
来源:互联网 发布:网络优化培训班泉州 编辑:程序博客网 时间:2024/04/30 17:40
最近写作业遇到的一个问题,花了两天时间才解决。
问题背景是平衡树的插入和删除,为了方便就直接拿老师示例代码进行更改。在线下自己测试都没问题,但是提交到线上就会出现内存访问错误(exitcode11),自己写了一个生成算例的小程序进行测试还是没有问题。后来经助教提示,选择与线上测试更接近的编译器。之前环境是Win8+VS2012,后来在Win7+Dev-cpp 4.9.9.2上测试,终于重现出问题。经过对不同模块的测试,最终将错误代码定位到其中一行:
FromParentTo ( *g ) = rotateAt ( tallerChild ( tallerChild ( g ) ) ); //为了能够使父节点正常地指向旋转后的子节点
其中左侧为一个宏,定义为:
#define FromParentTo(x) /*来自父亲的引用*/ \ ( IsRoot(x) ? this->_root : ( IsLChild(x) ? (x).parent->lc : (x).parent->rc ) )
经测试发现在dev-cpp下,这行代码会出问题,经过变换后树的结构变化并不正确。而在VS下无这个问题。
当时就在想出错的原因是否是因为等是两侧执行的顺序不同而导致的,后来有点困了,就先停下来了。第二天助教回邮件也说道可能是这个问题。于是将这句话改为:
if (!g->parent)this->_root = rotateAt ( tallerChild ( tallerChild ( g ) ) );else if (IsLChild(*g)) {BinNodePosi(T) p = g->parent; p->lc = rotateAt ( tallerChild ( tallerChild ( g ) ) ); } else { BinNodePosi(T) p = g->parent; p->rc = rotateAt ( tallerChild ( tallerChild ( g ) ) ); }
困扰两天的问题终于解决!也验证了猜想,即由于在Dev-cpp中,先执行等式右侧代码,而导致树的结构发生变化,再执行等式左侧得到的结果已经不是从之前节点g来自父节点的引用。而在VS下结果相反,因此并未代码并没有出问题。
此外,最后提交代码时超时,最终经提醒采用了增加缓冲区大小的方式来减少IO读取次数,从而提高读取速度,具体代码如下:
char inBuf [100000]; setvbuf(stdin, inBuf, _IOFBF, 100000);之后正常使用scanf,printf等。
总结一下:
1.Dev-cpp编译器会先执行等式右侧表达式再执行左侧,而VS则相反。
2.尽量减少长代码,不仅影响阅读,还容易出错。
3.使用setvbuf可以在一定程度上提高读取速度。
0 0
- 不同编译器对于等号左右两侧执行顺序及简单IO优化
- C# 等号两边执行顺序
- SQL执行顺序及优化
- IOS中左右两侧导航栏的简单实现
- IOS中左右两侧导航栏的简单实现
- IOS中左右两侧导航栏的简单实现
- 顺序查找及简单优化
- 去掉左右两侧的‘,’
- sql执行顺序及oracle优化
- sql执行顺序及性能优化
- 等号左右对换
- 左右两侧浮动广告代码
- 左右两侧浮动广告代码
- JS 左右两侧浮动广告
- 登录式shell的执行顺序及简单应用
- C++与G++编译器对于cin.sync()的不同表现
- 左右两侧上下浮动图片代码
- Swift 设置navigation左右两侧按钮
- SDUT_2015寒假集训_结构体练习_J-逆序建立链表
- linux下导入、导出mysql数据库命令
- jquery uploadify参数说明
- [前端] nodejs入门[浅入深出]
- 图片下载工具类:BitmapUtil
- 不同编译器对于等号左右两侧执行顺序及简单IO优化
- 2.Git的诞生
- Android Studio ADB响应失败解决方法
- Windows Shell 中对乘号(*)的处理问题
- 循环MAP
- 3.集中式vs分布式
- 【数据结构之链栈的基本运算】
- java.lang.RuntimeException nativeLibraryDirectories
- 新手教程之-在github上建立博客