編譯器vs.代碼 誰之過

摘要:編譯器是將程序語言編譯成機器語言的一種高級程序。如今許多編譯器越發智能,在編譯不通過的情況,你的代碼甚至都無法運行,那么到底是編譯的問題還是您的代碼問題呢?

許多程序員喜歡抱怨編譯器報出的各做錯誤,難道真的是編譯器問題嗎?下面就讓我們來談談吧!

你確定嗎?

當程序員告訴你,編譯器會產生錯誤,請問你會信嗎?99%的情況下,你會把它當作一個謊言或者是笑話,甚至在內心會嘲笑這個程序員。

通常編譯報的錯主要有以下幾種:

  • 數組溢出
  • 變量沒有初始化
  • 輸出錯誤
  • 同步錯誤
  • 非法使用變量
  • 調用未定義方法或其它
  • 等等

對編譯器報出的這些錯誤你是否早已如數家珍,但這并沒有阻止程序員一次次對編譯器的指責與抱怨。似乎這一切都是編譯器的錯!

編譯器也可能包含錯誤,但是這種機率真的很小,除非你使用一些稀奇古怪的編譯器。在我多年使用Visual C++的職業生涯中,我只看到一次匯編代碼生成錯誤。

建議

當你在開始抱怨前,首先檢查一下自己的代碼是否有錯并且已更正,其次,最好看看別的程序員是如何評價這個錯誤的。

目的

先奉上一段編譯代碼供大家娛樂一下:

  1. TprintPrefs::TprintPrefs(IffdshowBase?*Ideci, ?
  2. ?????????????????????????const?TfontSettings?*IfontSettings) ?
  3. { ?
  4. ??memset(this,?0,?sizeof(this));?//?This?doesn't?seem?to ?
  5. ?????????????????????????????????//?help?after?optimization. ?
  6. ??dx?=?dy?=?0; ?
  7. ??isOSD?=?false; ?
  8. ??xpos?=?ypos?=?0; ?
  9. ??align?=?0; ?
  10. ??linespacing?=?0; ?
  11. ??sizeDx?=?0; ?
  12. ??sizeDy?=?0; ?
  13. ??... ?
  14. }?

我可以想象程序員看到這段注釋會有多憤怒,多令人討厭的編譯器!在調試版本階段,所有變量都被賦0值。由于優化問題,在發布版本中會包含一些垃圾。面對這種情況,最好的解決之道便是檢查代碼,而作為程序員,你還需繼續編寫代碼,用勇氣戰勝邪惡!

下面讓我們來分析上面這段代碼,你發現沒?memset()函數不工作的原因僅僅是因為一個非常簡單的錯誤:第三個參數是計算指針的大小而不是計算結果的尺寸。正確的調用應該是:“memset(this,0,sizeof(*this));”

順便說一句,函數memcpy()函數的效率也非常低。我確信,程序員肯定會說編譯器開發商真迂腐。

  1. void?Assign(const?AVSValue*?src,?bool?init)?{ ?
  2. ??if?(src->IsClip()?&&?src->clip) ?
  3. ????src->clip->AddRef(); ?
  4. ??if?(!init?&&?IsClip()?&&?clip) ?
  5. ????clip->Release(); ?
  6. ??//?make?sure?this?copies?the?whole?struct! ?
  7. ??//((__int32*)this)[0]?=?((__int32*)src)[0]; ?
  8. ??//((__int32*)this)[1]?=?((__int32*)src)[1]; ?
  9. ??memcpy(this,src,sizeof(this)); ?
  10. }?

從注釋中可以明白這段代碼試圖從其他方法中拷貝內存。然而,編寫這段代碼的程序員試圖丟棄使用memcpy()方法。當程序員想要復制的結構體正好是8字節的時候,在64位系統里面正好可以運行。

通過上面的分析大家可以明白,抱怨與指責編譯器(制造商)是無法解決任何問題的,只會浪費時間,無法靜下心繼續編寫代碼。還是好好 檢查一下你們自己的代碼吧!此外,工具是死的,人是活的,程序員們,你們才是 工具的主人!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 在 Google 開發者大會上發布了哪些更新? | Google 開發者大會 2018

有哪些新的 Android 系統特性 Google Play 上的 targetVersion 要求 2018年8月 新應用發布必須為26或者更高2018年11月 升級現有應用必須為26或者更高2019年之后 新發布或者升級應用必須為一年內發布的 Android 版本工信部已經出臺相應的政策,中國主流的應用市場也已…

兩個不同的數據庫如何跨庫事務

首先我們要明白同一實例,簡單來說就是一個ip,如果兩個數據庫位于同一個ip,就是同一實例。其實實例并不相當于ip, 他其實相當于服務,也就是serve。 這樣的兩個或多個就可以跨庫事務,比如 begin; insert in…

鏈表排序(冒泡、選擇、插入、快排、歸并、希爾、堆排序)

參考http://www.cnblogs.com/TenosDoIt/p/3666585.html 插入排序(算法中是直接交換節點,時間復雜度O(n^2),空間復雜度O(1)) 1 class Solution {2 public:3 ListNode *insertionSortList(Lis…

zookeeper使用和原理探究

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 zookeeper介紹 zookeeper是一個為分布式應用提供一致性服務的軟件,它是開源的Hadoop項目中的一個子項目,并且根據…

thinkphp如何部署到寶塔面板nginx服務器

原理:一般本地都會使用apache服務器,這個對pathinfo(兩個,一個是環境變量$_SERVER[PATH_INFO],另一個是pathinfo函數)路由解析非常支持的,不需要部署什么, 但是nginx是對pathinfo函…

Android獲取所有應用的資源id和對應的uri

背景在某些應用中,為了實現應用apk資源放入重復利用,或者使用反射得到本應用的資源,需要使用反射方式獲得,但Resources類中也自帶了這種獲取方式,并且功能更加強大你可以獲取string,color,drawable,raw,xml等文件&…

nginx的腳本引擎(一)

nginx的腳本的語法和shell是很像的,我大致看了一下覺得挺有意思的,就想寫寫記錄一下。我沒看過shell腳本的引擎,不知道nginx腳本引擎和shell腳本引擎像不像,但是我覺得nginx的腳本引擎有點像C和匯編。 ngx_http_script_engine_t這…

一個待辦事列表todolist

最近有位老師讓我做的,圖片在下面,做了4個多小時,ui有的簡陋,可以再美化一下,這個會更好看,畢竟我也不是專業前端,測試網站http://todolist.sshouxin.top/使用的是thinkphp5.1的框架&#xff0c…

詳細說明 SourceTree 免登錄,跳過初始設置的方法(Windows 版 )

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 首先,安裝完 SourceTree 以后先運行一次,彈出初始化登錄頁面后退出。 2. 進入這個文件夾:C:\Users…

什么是好的API設計?

摘要:有人言,API設計是編程工作中最難的事情。甚至有人認為至少要有10年的工作經驗才能接觸它。不過這里提出了一個引人思考的問題:究竟是構建什么樣的庫需要花費10年的時間去學習? 有人言,API設計是編程工作中最難的事…

Linux學習記錄-文件、目錄與磁盤

用戶和群組 用戶和群組主要是為了區分用戶對文件的操作權限。 賬號在/etc/passwd個人密碼在/etc/shadow組信息在/etc/group 不要亂動這3個文件文件權限和目錄配置 文件屬性 文件前綴解釋,例如: 第一個字符代表這個文件是『目錄、文件或鏈接文件等等』&am…

php curl模擬https請求

https請求(支持GET和POST) function http_request($url,$data null){$curl curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if(!empty($data)){curl_setopt($cur…

springboot集成環信sdk報錯

import io.swagger.client.ApiException; import io.swagger.client.api.MessagesApi; import io.swagger.client.model.Msg 這個是因為少兩個包,只需要把在你的pom.xml添加以下代碼即可,不要忘記點贊哈只需要添加兩個包即可,你可以自行網上下…

解決 error: Your local changes to the following files would be overwritten by merge:XXXX

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 idea 上將本地代碼推送到 git后 , 報錯如下圖 error: Your local changes to the following files would be overwritten by merge:src/…

深度有趣 | 30 快速圖像風格遷移

簡介 使用TensorFlow實現快速圖像風格遷移(Fast Neural Style Transfer) 原理 在之前介紹的圖像風格遷移中,我們根據內容圖片和風格圖片優化輸入圖片,使得內容損失函數和風格損失函數盡可能小 和DeepDream一樣,屬于網絡…

轉型從思維習慣的轉變開始

摘要:首先建議大家不要輕易轉向管理崗位,要認清自己是否適合做管理。轉型過程中應把握好幾點:良好的技術基礎,它是贏得團隊信任的前提,是把握團隊整體方向的關鍵;培養大局觀,只有站得高才能看得…

數據庫小知識點(一直更新)

一、mysql查詢是否含有某字段: mysql數據庫查詢帶有某個字段的所有表名 SELECT * FROM information_schema.columns WHERE column_namecolumn_name; oracle數據庫查詢帶有某個字段的所有表名 select column_name,table_name,from user_tab_columns where column_n…

其他運算符

原文地址:https://wangdoc.com/javascript/ void運算符 void運算符的作用是執行一個表達式,然后不返回任何值,或者說返回undefined。 void 0 // undefined void(0) // undefined 上面是void運算符的兩種寫法,都正確。建議采用后一…

git pull --rebase 做了什么? 以及 Cannot rebase: You have unstaged changes 解決辦法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 最近剛學 git rebase,覺得很牛逼的樣子, 結果今天就被打臉了。 git pull --rebase 1 報錯: Cann…

vue如何實現單頁緩存方案分析

實現全站的頁面緩存,前進刷新,返回走緩存,并且能記住上一頁的滾動位置,參考了很多技術實現,github上的導航組件實現的原理要么使用的keep-alive,要么參考了keep-alive的源碼,但是只用keep-alive…