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

編譯50字節代碼耗費4G內存

開發 項目管理
想用宏和內聯匯編做些邪惡的事情(僅僅試著做一些怪異的測試,目的無關緊要),我決定寫個程序讓Vistual Studio的C++編譯器分配4GB的內存,然后處于卡死狀態。寫個50字節的代碼就可以了。

想用宏和內聯匯編做些邪惡的事情(僅僅試著做一些怪異的測試,目的無關緊要),我決定寫個程序讓Vistual Studio的C++編譯器分配4GB的內存,然后處于卡死狀態。

寫個50字節的代碼就可以了。

一開始我可能沒注意到我的機子并沒有4GB的空閑內存,瘋狂的數據分頁,需要找到4GB的內存,使得我的筆記本在幾分鐘內都毫無反應。如果你的機子有超過4GB的空閑內存,使用ETW做內存分析倒是個很好的測試,看看你可以復現我的結果嗎?

我簡化了代碼,只留下的最基本的精華部分,只是覺得這樣很好玩:

  1. void test() 
  2.     __asm { add eax 
  3.     __asm { add eax 

這是編譯器的輸出:

  1. error C2414: illegal number of operands 
  2. error C2414: illegal number of operands 
  3. error C2400: inline assembler syntax error in ‘opcode’; found ‘end of file’ 
  4. fatal error C1060: compiler is out of heap space 

 

我是在Windows 64位上運行的,編譯器是32位的大型地址進程,所以堆空間耗盡意味著分配大約4GB的內存空間。我連續進行多次編譯,可以看出每次4GB的內存使用量都在飆升。

我很好奇,到底是哪部分編譯程序在分配這些內存。我使用cl.exe編譯器,用etwheap.bat記錄了所有的堆空間和 VirtualAlloc 分配 ,并再次編譯了源文件。事實證明我本應該使用wprui’s VAlloc Usage選項去獲取追蹤。僅僅只有幾MB是從堆上分配的,大部分都是使用VirtualAlloc來分配的,如圖所示:

接下來,為了完成調查,我查看了所有的調用棧。我們可以看到內聯匯編程序的語法分析器正在使用它自己的VirtualHeap分配大量的Asm Tokens。VirtualHeap::Create 預留內存空間,VirtualHeap::HeapExtend提交內存。再深入研究下(沒有顯示)發現內存空間預留在512KB的內存塊,被提交在 32KB的內存塊。

還有一些細節,不是很清楚,像為什么VirtualHeap::HeapExtend調用 VirtualHeap::Create,但是卻沒有源代碼,難以得知。

所以我們不再探究了,我像往常一樣將把這個問題提交給VC++團隊。如果他們解決了這個問題,我并不驚訝,這也算不上是一個嚴重的問題。第一次遇到這個問題時,因為我的機子沒有4GB的空閑內存,所以才注意到它。

編譯器是32位進程也是件好事兒,要不然它還會繼續消耗內存,將遠遠超過4GB。條件限制萬歲!

這些測試都是在VC++ 2010 的調試版本上進行的,我沒試過其他版本。

 Linux 變體

還有一個很類似的問題(鏈接器在一個很簡單的程序上消耗了大量內存,詳情見 棧溢出)。

Windows 糟透了?

我預料到有人會說Windows太爛了,這就是為什么當遇到這個問題時,我的筆記本幾分鐘內都毫無反應。但是如果在Linux和OSX系統上分配 (或寫入)4GB的內存,并不會引發嚴重的系統延遲問題,但其實這說明不了什么。我的筆記本只有8GB的內存,大部分都在被使用,想獲取到空閑的4GB內 存的唯一可能的辦法就是把大量的數據寫到磁盤上。筆記本的硬盤相當慢,如果我是在工作機子上(32GB的內存,20GB可用)或者當筆記本上只有很少的程 序在運行時(5GB空閑內存),做同樣的測試,4GB內存的分配和釋放不到5秒中就可以完成。

Reddit的討論鏈接在這兒。

額外補充

很奇怪,怎么會有一些博客文章比其他人的更受歡迎…

有人在復現這個問題時遇到了困難,這個bug只能確定在VS2010 SP1 出現,并且test函數放在源文件的最后。

這顯然不是一個嚴重的bug—代碼也有缺陷,編譯器有給出了警告并且指出問題所在,也沒出現什么大問題。但是它的確是一個失敗的詞法分析程序。尤其 是,內存不足會阻止VC++去報告一些括號不匹配的問題—假如你在test函數之后再添加一個函數,詞法分析完成后,額外的警告就會顯示出來了。

編譯錯誤代碼時給出出錯的信息提示是很重要的,這也是Clang的顯式設計目標之一。

在 Visual Studio SP1 中復現這個 Bug 了。見下圖或查看原圖。

原文鏈接:http://randomascii.wordpress.com/2013/08/14/50-bytes-of-code-that-took-4-gb-to-compile/

譯文鏈接:http://blog.jobbole.com/46106/

責任編輯:陳四芳 來源: 伯樂在線
相關推薦

2012-07-02 16:55:48

4G

2021-01-10 21:13:21

4G5GLTE技術

2013-01-30 09:25:21

4G通信網絡LTE

2021-05-10 10:16:03

5G4G網絡

2011-10-19 08:08:20

LTE

2011-09-29 10:13:30

4G3G

2009-06-09 10:34:41

802.16mLTE4G

2013-12-02 14:15:35

4G移動

2012-05-02 15:10:08

華碩筆記本

2017-08-01 08:28:46

4G服務器MySQL

2013-12-05 09:20:58

中移動4G牌照4G網絡

2009-09-03 15:22:05

RHEL5內存紅帽

2011-04-29 17:36:32

筆記本ThinkPad T4

2023-08-28 07:51:24

8G內存Swap

2013-09-02 15:04:58

2015-05-29 11:46:29

4G

2013-12-18 11:10:34

4G5G中國移動

2010-08-02 23:26:17

4G

2013-12-17 09:52:55

4G移動互聯網

2014-08-18 09:35:13

4G
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品在线观看免费 | 日本三级电影免费观看 | 美女一级a毛片免费观看97 | 国产二区在线播放 | 国产精品美女一区二区三区 | 国产精品日韩欧美一区二区三区 | 成人亚洲 | 精品美女视频在免费观看 | 亚洲一区二区国产 | 成人一区二区三区在线观看 | 91爱啪啪| 极品在线 | 亚洲美女网站 | 久久国产欧美日韩精品 | 日韩一区精品 | 亚洲永久免费观看 | 蜜桃视频在线观看免费视频网站www | 一级毛片观看 | 黄色片网此| 91精品国产色综合久久 | 日本精品视频 | 日本久草 | 黄色一级大片视频 | 精品成人在线观看 | 美女久久视频 | 日韩精品一区二区三区中文在线 | 久久久久免费 | 中文字幕在线不卡 | 日韩av视屏 | 日本三级网站在线观看 | 成人毛片视频在线播放 | 色999视频 | 成人h片在线观看 | 91在线视频观看免费 | 日韩电影中文字幕 | 欧美一区二区三区视频 | 日本一区二区影视 | 亚洲iv一区二区三区 | 亚洲 欧美 日韩在线 | 91高清在线观看 | 久久精品一级 |