C C 主流編譯器為什麼不做成debug模式編譯的程式檢查陣列越界 溢位等錯誤,release模式編譯的程式不檢查?

時間 2021-06-01 22:24:24

1樓:

看錯問題了

debug模式,VC可以檢查指向棧上物件的指標是否越界

對於new或者malloc出來的堆上的資料,就沒法判斷了

根源在於,C/C++並沒有規範規定new或malloc出來的空間前後需要有什麼樣的標記,new甚至可以過載使得分配記憶體在自己預申請的空間內,或者這個空間甚至根本不是C/C++系統生成的,是別的語言/SDK申請的一段空間,然後以位址的形式傳到C/C++這裡來。這樣拿到乙個指標p,並且想解引用的時候沒有統一的方式判斷p到p+1是否處於合法的空間內。

下面的例子,在Func函式中,不可能知道p開始的空間是誰建立的,Func(p+10) VC debug不會出錯,Func(&a)會報棧錯誤

void Func(int *p)

int main()

況且,VC棧錯誤也是在程式執行完之後報出來,對每個解引用都檢查有效性代價太大

並且,不僅要對所有的指標檢查,所有引用也要檢查,每個指標/引用解引用每個元素的時候檢查,比如下面a.x賦值正常,a.y賦值錯誤

void

Func(A

&a)int

main

()原回答:

效率,release就是要快,對於每乙個指標解引用都檢查有效性是個巨大的開銷,特別對於計算密集型程式

現代C C 編譯器有多智慧型?能做出什麼厲害的優化?

Xi Yang 弱爆了,連幫我把卷積自動 優化 成FFT加速的都做不到。另外,如果你寫 struct MyVec4i 使用處 MyVec4i v1 1,2,3,4 MyVec4i v2 5 6 7 8 MyVec4i result v1 v2 MSVC 我特麼就是要往記憶體裡放。 原子筆 我把裡面的...

為什麼經常聽人說編譯器比你聰明?

其實沒我聰明,我沒見過哪個編譯器能把判斷是否是 2 的冪的迴圈寫法,優化成 n n 1 的 doge 關於 人的優勢是知道的多 這一點,現在的編譯器通過inlining和LTO來擴大分析範圍,還是可以作出更多優化的。有時求解非常複雜的約束關係來進行優化,也有https r 這種基於Z3的優化器。 不...

為什麼高版本的編譯器在使用calloc的時候有類似呼叫建構函式的環節,但是malloc始終沒有?

正如 Milo Yip 大佬所說,對於非pod型別,它們可能有自己的建構函式,虛表等,不能單用malloc這樣粗暴的方法,應該通過c 關鍵字new來使它初始化,它不僅僅構造物件,同時也構造虛表 如果有的話 乙個常見的問題是,vs下有人經常會ZeroMemory清空乙個容器,如vector,容器依舊可...