成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Debug模式和Release模式有什么區別你知道嗎?

開發 前端
愛玲曾說過:“開發過程就是個玄學。”有時候,程序在Debug模式下運行的好好的,一Release就crash了。

 [[381126]]

本文轉載自微信公眾號「程序喵大人」,作者程序喵大人 。轉載本文請聯系程序喵大人公眾號。

張愛玲曾說過:“開發過程就是個玄學。”

有時候,程序在Debug模式下運行的好好的,一Release就crash了。

有時候,程序在Debug模式下崩潰了,Release模式下居然能正常運行。

可能很多人都遇到過以上的情況。

 

用C/C++的朋友都知道編譯器編譯有各種優化級別,編譯器優化級別大體如下:

O0(默認選項):不開啟優化,方便功能調試

Og:方便調試的優化選項(比O1更保守)

O1:保守的優化選項,打開了四十多個優化選項

O2:常用的發布優化選項,在O1的基礎上額外打開了四十多個優化選項,包括自動內聯等規則

Os:產生較小代碼體積的優化選項(比O2更保守)

O3:較為激進的優化選項(對錯誤編碼容忍度最低),在O2的基礎上額外打開了十多個優化選項

Ofast:打開可導致不符合IEEE浮點數等標準的性能優化選項。

具體介紹如下:

O0:編譯器默認就是O0,該選項下不會開啟優化,方便開發者調試。

O1:致力于在不需要過多的編譯時間情況下,盡量減少代碼大小和盡量提高程序運行速度,它開啟了下面的優化標志:

  1. -fdelayed-branch 
  2.  
  3. -fdse 
  4.  
  5. -fforward-propagate  
  6.  
  7. -fguess-branch-probability  
  8.  
  9. -fif-conversion 
  10.  
  11. -fif-conversion2 
  12.  
  13. -finline-functions-called-once 
  14.  
  15. -fipa-modref 
  16.  
  17. -fipa-profile 
  18.  
  19. -fipa-pure-const 
  20.  
  21. -fipa-reference 
  22.  
  23. -fipa-reference-addressable 
  24.  
  25. -fmerge-constants 
  26.  
  27. -fmove-loop-invariants 
  28.  
  29. -fomit-frame-pointer 
  30.  
  31. -freorder-blocks 
  32.  
  33. -fshrink-wrap 
  34.  
  35. -fshrink-wrap-separate 
  36.  
  37. -fsplit-wide-types 
  38.  
  39. -fssa-backprop 
  40.  
  41. -fssa-phiopt  
  42.  
  43. -ftree-bit-ccp 
  44.  
  45. -ftree-ccp 
  46.  
  47. -ftree-ch 
  48.  
  49. -ftree-coalesce-vars 
  50.  
  51. -ftree-copy-prop 
  52.  
  53. -ftree-dce 
  54.  
  55. ftree-dominator-opts 
  56.  
  57. -ftree-dse 
  58.  
  59. -ftree-forwprop  
  60.  
  61. -ftree-fre 
  62.  
  63. -ftree-phiprop 
  64.  
  65. -ftree-pta 
  66.  
  67. -ftree-scev-cprop 
  68.  
  69. -ftree-sink  
  70.  
  71. -ftree-slsr 
  72.  
  73. -ftree-sra  
  74.  
  75. -ftree-ter 
  76.  
  77. -funit-at-a-time 

Og:如果是為了調試,該選項是比O0更好的選擇,它會打開O1大部分優化標志,但是不會啟用那些影響調試的標志:

  1. -fbranch-count-reg                                         
  2.  
  3. -fdelayed-branch 
  4.  
  5. -fdse 
  6.  
  7. -fif-conversion 
  8.  
  9. -fif-conversion2 
  10.  
  11. -finline-functions-called-once 
  12.  
  13. -fmove-loop-invariants 
  14.  
  15. -fssa-phiopt 
  16.  
  17. -ftree-bit-ccp  
  18.  
  19. -ftree-dse 
  20.  
  21. -ftree-pta  
  22.  
  23. -ftree-sra 

O2:常見的Release級別,該選項下幾乎執行了所有支持的優化選項,它增加了編譯時間,提高了程序的運行速度,又額外打開了以下優化標志:

  1. -flra-remat 
  2.  
  3.  -foptimize-sibling-calls 
  4.  
  5.  -foptimize-strlen 
  6.  
  7.  -fpartial-inlining 
  8.  
  9.  -fpeephole2 
  10.  
  11.  -freorder-blocks-algorithm=stc 
  12.  
  13.  -freorder-blocks-and-partition 
  14.  
  15.   -freorder-functions 
  16.  
  17.  -frerun-cse-after-loop 
  18.  
  19.    -fschedule-insns 
  20.  
  21.   -fschedule-insns2 -fsched-interblock 
  22.  
  23.   -fsched-spec 
  24.  
  25.  -fstore-merging 
  26.  
  27.  -fstrict-aliasing 
  28.  
  29.  -fthread-jumps 
  30.  
  31.  -ftree-builtin-call-dce 
  32.  
  33.  -ftree-pre 
  34.  
  35.  -ftree-switch-conversion 
  36.  
  37.   -ftree-tail-merge 
  38.  
  39.  -ftree-vrp 

Os:打開了幾乎所有的O2優化標志,除了那些經常會增加代碼大小的優化標志:

  1. -falign-functions                                                 
  2.  
  3. -falign-jumps 
  4.  
  5. -falign-labels 
  6.  
  7. -falign-loops 
  8.  
  9. -fprefetch-loop-arrays 
  10.  
  11. -freorder-blocks-algorithm=stc 

它還啟用了-finline-functions優化標志,使編譯器根據代碼大小而不是程序運行速度進行優化,為了減少代碼大小。

O3:在O2的基礎上又打開了以下優化標志

  1. -fgcse-after-reload                                          
  2.  
  3. -fipa-cp-clone 
  4.  
  5. -floop-interchange 
  6.  
  7. -floop-unroll-and-jam 
  8.  
  9. -fpeel-loops 
  10.  
  11. -fpredictive-commoning 
  12.  
  13. -fsplit-loops 
  14.  
  15. -fsplit-paths 
  16.  
  17. -ftree-loop-distribution 
  18.  
  19. -ftree-loop-vectorize 
  20.  
  21. -ftree-partial-pre 
  22.  
  23. -ftree-slp-vectorize 
  24.  
  25. -funswitch-loops 
  26.  
  27. -fvect-cost-model 
  28.  
  29. -fvect-cost-model=dynamic 
  30.  
  31. -fversion-loops-for-strides 

Ofast:更加激進的編譯選項,它不會嚴格遵循標準,在O3的優化基礎上,它又開啟了一些可能導致不符合IEEE浮點數等標準的性能優化選項,如- fast-math, -fallow-store-data-races等。

tips:上述優化選項如果想要了解具體含義可以看https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html 官方文檔。

編譯器有這么多優化級別,Debug版本和Release版本其實就是優化級別的區別,Debug稱為調試版本,編譯的結果通常包含有調試信息,沒有做任何優化,方便開發人員進行調試,Release稱為發布版本,不會攜帶調試信息,同時編譯器對代碼進行了很多優化,使代碼更小,速度更快,發布給用戶使用,給用戶使用以更好的體驗。但Release模式編譯比Debug模式花的時間也會更多。

Debug模式下在內存分配上有所區別,在我們申請內存時,Debug模式會多申請一部分空間,分布在內存塊的前后,用于存放調試信息。

對于未初始化的變量,Debug模式下會默認對其進行初始化,而Release模式則不會,所以就有個常見的問題,局部變量未初始化時,Debug模式和Release模式表現有所不同。

  1. bool func() { 
  2.     bool found; 
  3.     for (int i = 0; i < vec.size(); ++i) { 
  4.         if (vec[i] == 3) { 
  5.             found = true
  6.         } 
  7.     } 
  8.     return found;  

Debug模式下可能運行正常,但Release模式下可能會返回錯誤結果,因為found局部變量在Release模式下沒有初始化。

Debug模式以32字節為單位分配內存,例如當申請24字節內存時,Release模式下是正常的分配24字節,Debug模式會分配32字節,多了8字節,所以有些數組越界問題在Debug模式下可以安全運行,Release模式下就會出問題。

Debug模式下可以使用assert,運行過程中有異?,F象會及時crash,Release模式下模式下不會編譯assert,遇到不期望的情況不會及時crash,稀里糊涂繼續運行,到后期可能會產生奇奇怪怪的錯誤,不易調試,殊不知其實在很早之前就出現了問題。編譯器在Debug模式下定義_DEBUG宏,Release模式下定義NDEBUG宏,預處理器就是根據對應宏來判斷是否開啟assert的。

數據溢出問題,在一個函數中,存在某些從未被使用的變量,且函數內存在數據溢出問題,在Debug模式下可能不會產生問題,因為不會對該變量進行優化,它在棧空間中還是占有幾個字節,但是Release模式下可能會出問題,Release模式下可能會優化掉此變量,棧空間相應變小,數據溢出就會導致棧內存損壞,有可能會產生奇奇怪怪的錯誤。

例如:

  1. void func() { 
  2.     char buffer[10]; 
  3.     int counter; 
  4.     lstrcpy(buffer, "abcdefghik"); // 需要拷貝11字節 

tips:不要將Debug庫和Release庫混合在一起,可能會出問題,至于為啥會出問題,知道的可在下方評論區留言,一般都是有兩個目錄,Debug目錄和Release目錄。

回到開篇提到的那兩個問題:

 

參考資料

http://www.flounder.com/debug_release.htm

https://vinayakgarg.wordpress.com/2012/03/31/difference-between-debug-build-and-release-build/

https://www.xspdf.com/resolution/312312.html

https://docs.oracle.com/cd/E19205-01/820-1214/bkacs/index.html

https://www.cnblogs.com/huaping-audio/archive/2008/08/23/1274833.html

https://www.zhihu.com/question/27090458

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2024-05-27 00:00:00

localhostIPv6IPv4

2022-03-13 18:53:31

interfacetypeTypeScript

2022-06-08 07:34:25

InnoDBdeleteMySQL

2021-07-27 08:02:45

DTO 軟件Pojo

2022-08-26 01:41:42

GPUCPU架構

2018-10-26 10:41:06

ApacheNginx服務器

2022-07-05 08:05:00

策略模式接口實現類

2024-11-26 14:29:48

2024-10-22 09:59:36

虛擬化容器化系統

2024-03-26 00:10:08

預測AI泛化

2024-01-01 08:25:53

ViewSurface框架

2022-02-18 17:21:29

適配器模式客戶端

2016-12-19 09:21:26

WindowsClean Boot區別

2024-07-03 08:33:08

2019-12-02 10:16:46

架構設計模式

2018-07-04 11:02:23

無線傳輸模式

2022-05-16 11:04:43

RocketMQPUSH 模式PULL 模式

2023-12-07 07:08:09

Angular函數

2023-04-26 10:21:04

2023-06-01 08:15:04

CentOS紅帽
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲a在线观看 | 欧美黄色一级毛片 | 羞羞的视频在线看 | 婷婷久久久久 | 福利视频网站 | www.4567 | 欧美日韩a| 夜夜av | 久久精品一区二区三区四区 | 九九免费在线视频 | 国产高清视频一区 | 亚州精品天堂中文字幕 | 国产亚洲精品久久久优势 | 中文字幕在线播放第一页 | 综合激情久久 | 亚洲精品电影 | aaaaaaa片毛片免费观看 | 午夜视频在线观看一区二区 | 91av视频| 国产一区影院 | 日本黄色不卡视频 | 亚洲精品福利在线 | 国产羞羞视频在线观看 | 亚洲不卡在线观看 | 日韩有码一区 | 在线免费观看亚洲 | 少妇黄色| 亚洲综合视频 | www精品美女久久久tv | 亚洲精品一区二区三区蜜桃久 | 黑人精品欧美一区二区蜜桃 | 91影视 | 国产一区二区在线免费观看 | 一区亚洲 | 日本在线中文 | 亚洲品质自拍视频 | 日日操夜夜操天天操 | 精品国产乱码久久久久久闺蜜 | 成年精品 | 日本免费在线观看视频 | 亚洲成人中文字幕 |