91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++說明后置條件有什么優點

發布時間:2021-11-25 16:26:27 來源:億速云 閱讀:157 作者:iii 欄目:大數據

這篇文章主要介紹“C++說明后置條件有什么優點”,在日常操作中,相信很多人在C++說明后置條件有什么優點問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++說明后置條件有什么優點”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

I.7: State postconditions (說明后置條件)

Reason(原因)

To detect misunderstandings about the result and possibly catch erroneous implementations.

一方面可以檢查對于結果的錯誤理解,另一方面可以捕捉易錯實現。

Example, bad(反面示例)

Consider:(考慮)

int area(int height, int width) { return height * width; }  // bad

這里我們(魯莽地)遺漏了定義前置條件,因此沒有明確高度和寬度必須為正值這件事。我們也沒有定義后置條件,因此當面積大于最大整數的時候算法存在錯誤這件事也不容易被察覺。這里會發生溢出錯誤。考慮使用:


int area(int height, int width){    auto res = height * width;    Ensures(res > 0);    return res;}

譯者注:和Expects表示前置條件相對,Ensures用于表現后置條件。這符合現代C++的發展思路:提倡表達目的而不是做法。

Example, bad(反面示例)

Consider a famous security bug:(考慮一個著名的安全性bug)

void f()    // problematic{    char buffer[MAX];    // ...    memset(buffer, 0, sizeof(buffer));}

There was no postcondition stating that the buffer should be cleared and the optimizer eliminated the apparently redundant memset() call:

不存在后置條件表明buffer應該被清空,因此優化程序會消除明顯多余的memset調用。


void f()    // better{    char buffer[MAX];    // ...    memset(buffer, 0, sizeof(buffer));    Ensures(buffer[0] == 0);}

譯者注:這個例子比上一個稍好,但是Ensures的內容更像是專門防止優化的,似乎并沒有反映本來的想法。

Note(注意)

后置條件經常在描述函數目的的注釋中被非正式表達。使用Ensures()可以讓后置條件更系統,直觀和便于檢查。

Note(注意)

當后置條件和某些不會直接反映到返回值的結果時顯得尤為重要,例如數據結構被使用過的狀態等。

譯者注:調用者的可能更加注意有沒有,而忽略狀態等細節。

Example(示例)

Consider a function that manipulates a Record, using a mutex to avoid race conditions:

考慮一個操作記錄的函數,它使用mutex防止競爭條件。

mutex m;
void manipulate(Record& r)    // don't{    m.lock();    // ... no m.unlock() ...}

這里我們“忘記了”說明mutex應該被釋放這件事,因此我們不知道保證釋放mutex失敗這件事是bug還是功能。說明后置條件可以明確這件事:

void manipulate(Record& r)    // postcondition: m is unlocked upon exit{    m.lock();    // ... no m.unlock() ...}

有bug這件事已經很明顯了(但還只是人類可讀的注釋)。更好一些的選擇是:使用RAII來保證后置條件(“鎖必須被釋放”)會被強制釋放。

void manipulate(Record& r)    // best{    lock_guard<mutex> _ {m};    // ...}

譯者注:lock_guard是C++11開始的新特性,其實就是簡單的RAII封裝,在構造函數中進行加鎖,析構函數中進行解鎖。這樣做的好處是保證函數退出時,鎖一定被釋放。

Note(注意)

理想情況下,后置條件在接口或聲明時說明,這樣用戶就可以簡單地看到它們。只有和用戶相關的后置條件才可以在接口中描述。只和內部狀態有關的后置條件屬于定義和實現。

Enforcement(實施建議)

(非強制)這是一條哲學層面的準則,通常沒有辦法直接檢查。在很多工具鏈中會存在領域限定的檢查器(例如鎖保持檢查器)。

到此,關于“C++說明后置條件有什么優點”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

宾阳县| 五台县| 额尔古纳市| 宣化县| 武宁县| 甘德县| 肥东县| 宝丰县| 阿拉善左旗| 桃园县| 昭平县| 密山市| 秭归县| 濮阳县| 怀柔区| 大竹县| 康马县| 桦南县| 蒙阴县| 申扎县| 开阳县| 南丰县| 儋州市| 红桥区| 同心县| 连城县| 启东市| 洪湖市| 乐昌市| 蕉岭县| 松原市| 麻江县| 安塞县| 靖安县| 靖远县| 田阳县| 阳西县| 高邮市| 攀枝花市| 贺州市| 梁山县|