您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++編譯時為什么檢查比執行時檢查更好”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++編譯時為什么檢查比執行時檢查更好”吧!
Code clarity and performance. You don't need to write error handlers for errors caught at compile time.
代碼的清晰和性能。你不需要為編譯錯誤編寫處理程序。
譯者注:編譯時檢查不會占用執行時間,因此可以帶來更好的性能;編譯檢查一般都是利用編譯器,語言的基本功能,檢查代碼也會清晰明了。
Example(示例)
// Int is an alias used for integersint bits = 0; // don't: avoidable codefor (Int i = 1; i; i <<= 1) ++bits;if (bits < 32) cerr << "Int too small\n";
This example fails to achieve what it is trying to achieve (because overflow is undefined) and should be replaced with a simple static_assert
:
這個例子無法達成它想要達成的目標(因為溢出時的行為是無定義的)。它可以被一個簡單的static_assert代替:
譯者注:
代碼應該是想通過一個循環的左移操作計算Int的位數,如果小于32位就報錯。這是一種運行時檢查的方式。
static_assert支持編譯時的斷言檢查。
// Int is an alias used for integersstatic_assert(sizeof(Int) >= 4); // do: compile-time check
Or better still just use the type system and replace Int
with int32_t
.
或者直接使用類型系統并且用intr32_t代替Int。
Example(示例)
void read(int* p, int n); // read max n integers into *p
int a[100];
read(a, 1000); // bad, off the end
better(好一點)
void read(span<int> r); // read into the range of integers r
int a[100];
read(a); // better: let the compiler figure out the number of elements
譯者注:使用指針傳遞數據的read可以使用int型的大小信息進行范圍檢查,但是這種檢查只能在執行時進行;而span包含了數組的尺寸信息,如果數組長度在編譯時可以確定,span就可以實現編譯時的范圍檢查。
Alternative formulation: Don't postpone to run time what can be done well at compile time.
另一個表達:編譯時能做的,就不要延遲到執行時。
Enforcement(執行建議)
Look for pointer arguments.注意指針類型參數。
Look for run-time checks for range violations.注意運行時刻對范圍違反的檢查。
譯者注:通過指針傳遞數據之后,大小信息也作為變量傳遞,因此之后的范圍檢查都只能在執行時進行。有了模板類span之后,這些檢查都可以重新考慮,看看是否可以轉變成編譯時檢查。
感謝各位的閱讀,以上就是“C++編譯時為什么檢查比執行時檢查更好”的內容了,經過本文的學習后,相信大家對C++編譯時為什么檢查比執行時檢查更好這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。