编译器vs.代码 谁之过
许多程序员喜欢抱怨编译器报出的各做错误,难道真的是编译器问题吗?下面就让我们来谈谈吧!
你确定吗?
当程序员告诉你,编译器会产生错误,请问你会信吗?99%的情况下,你会把它当作一个谎言或者是笑话,甚至在内心会嘲笑这个程序员。
通常编译报的错主要有以下几种:
- 数组溢出
- 变量没有初始化
- 输出错误
- 同步错误
- 非法使用变量
- 调用未定义方法或其它
- 等等
对编译器报出的这些错误你是否早已如数家珍,但这并没有阻止程序员一次次对编译器的指责与抱怨。似乎这一切都是编译器的错!
编译器也可能包含错误,但是这种机率真的很小,除非你使用一些稀奇古怪的编译器。在我多年使用Visual C++的职业生涯中,我只看到一次汇编代码生成错误。
建议
当你在开始抱怨前,首先检查一下自己的代码是否有错并且已更正,其次,最好看看别的程序员是如何评价这个错误的。
目的
先奉上一段编译代码供大家娱乐一下:
- TprintPrefs::TprintPrefs(IffdshowBase *Ideci,
- const TfontSettings *IfontSettings)
- {
- memset(this, 0, sizeof(this)); // This doesn't seem to
- // help after optimization.
- dx = dy = 0;
- isOSD = false;
- xpos = ypos = 0;
- align = 0;
- linespacing = 0;
- sizeDx = 0;
- sizeDy = 0;
- ...
- }
我可以想象程序员看到这段注释会有多愤怒,多令人讨厌的编译器!在调试版本阶段,所有变量都被赋0值。由于优化问题,在发布版本中会包含一些垃圾。面对这种情况,最好的解决之道便是检查代码,而作为程序员,你还需继续编写代码,用勇气战胜邪恶!
下面让我们来分析上面这段代码,你发现没?memset()函数不工作的原因仅仅是因为一个非常简单的错误:第三个参数是计算指针的大小而不是计算结果的尺寸。正确的调用应该是:“memset(this,0,sizeof(*this));”
顺便说一句,函数memcpy()函数的效率也非常低。我确信,程序员肯定会说编译器开发商真迂腐。
- void Assign(const AVSValue* src, bool init) {
- if (src->IsClip() && src->clip)
- src->clip->AddRef();
- if (!init && IsClip() && clip)
- clip->Release();
- // make sure this copies the whole struct!
- //((__int32*)this)[0] = ((__int32*)src)[0];
- //((__int32*)this)[1] = ((__int32*)src)[1];
- memcpy(this,src,sizeof(this));
- }
从注释中可以明白这段代码试图从其他方法中拷贝内存。然而,编写这段代码的程序员试图丢弃使用memcpy()方法。当程序员想要复制的结构体正好是8字节的时候,在64位系统里面正好可以运行。
通过上面的分析大家可以明白,抱怨与指责编译器(制造商)是无法解决任何问题的,只会浪费时间,无法静下心继续编写代码。还是好好 检查一下你们自己的代码吧!此外,工具是死的,人是活的,程序员们,你们才是 工具的主人!
编译器vs.代码 谁之过相关推荐
- 基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)
基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#) 为了完美解析GLSL源码,获取其中的信息(都有哪些in/out/uniform等),我决定做个GLSL编译器的前端(以后简称编译器或 ...
- __declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码
__declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码 extern "C" void __declspec(naked) ...
- 重磅:华为方舟编译器开源代码「正式发布」
loonggg 读完需要 2 分钟 速读仅需1分钟 就在今天,8 月份的最后一天,华为方舟编译器开源官网正式上线了. 本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR,Interme ...
- Linux C++性能优化秘籍:从编译器到代码,探究高性能C++程序的实现之道
Linux C++性能优化秘籍:从编译器到代码,揭秘高性能C++程序的实现之道 引言 性能优化的重要性 Linux环境下C++程序的特点 高性能C++编程的核心要点 编译器优化 GCC与Clang编译 ...
- 类C编译器 C代码实现
大三上学期做的一个小项目 类C编译器 源代码和测试文件地址https://github.com/zxt1995/ttbox.git 总体框架: 读入待编译文件->语义分析并转换为指令->按 ...
- java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...
前言简介 前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译 ...
- 方舟编译器java代码_华为方舟编译器编译工具正式发布
2019 华为全球开发者大会将在 8 月 9 日-11 日在华为松山湖基地召开.本次开发者大会邀请了 1500 位合作伙伴.5000 名全球开发者,将是华为历来规模最大的一次会议.在这次大会上,华为方 ...
- notpad++快捷的编写代码并调用编译器编译代码
知识准备: 有cmd命令提示符使用经验或者简单的批处理bat脚本编写经验,如cd .del .echo 等简单命令 notpad++windows版在安装NPPEXEC插件之后,按f6可以编写脚本,下 ...
- 编译器中代码自动对齐快捷键
在VS2008中,选定代码后,按Ctrl+K+F组合键,可以自动进行代码对齐. 注意:要先按下Ctrl和K,再按下F,因为Ctrl+F是查找的快捷键. 也可以先按下Ctrl+K,再按下Ctrl+F. ...
最新文章
- (10) 需求征集 -- 权限管理
- 我在网上抢火车票:多加了100元的加速包,却依然买不到票
- JAVA 创建学生类
- 使用PyCharm运行第一行python代码
- vscode php插件_vscode+phpstudy+xdebug无法断点(踩坑记)
- 函数 迭代器,生成器
- [4G5G专题-45]:物理层-基带子载波数字调制解调(星座图, 相位调制PSK, 正交幅度相位调制QAM)
- bootstraptable冻结列无效_Bootstrap Table 冻结列功能详解
- android 跳转公众号,app直接跳转公众号
- 托利多bcom电子秤常用设置
- SE93 创建参数事务
- RTX 4070TI和RTX 4090性能差距 RTX4070ti和4070区别对比
- 关系数据模型和SQL基础
- shell遍历多个数组
- 大流量卡介绍:网上的大流量卡都是怎么来的?
- Struts2 ValueStack ActionContext OGNL 关系
- 多个blockquote_无线电力BLOCKQUOTE目录
- c语言--贪吃蛇小游戏
- 2016车联网畅想:野心谁都有,把握生态才是王道
- 2022牛客寒假算法基础集训营5 K造梦小孩
热门文章
- 【转】1.5异步编程:.NET4.X 数据并行
- angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现
- Python 中如何解决 asyncio 文件描述符最大数量限制问题
- Python3 基础学习笔记 C08 【类】
- 阿里一面 —— 什么是多线程?
- Mac下使用brew的常用步骤
- JetBrains - IDEA 常用快捷键汇总
- 【ZOJ - 3210】A Stack or A Queue? (模拟)
- 动手学无人驾驶(2):车辆检测
- Linux中软件安装使用的命令是,Linux软件安装命令