Sequence Point 順序點

來源:互聯網
上載者:User

1)在函數調用之前,對函數的所有參數的求值必須全部完成

2)一旦一個函數開始執行, 調用者函數中的運算式將不會開始求值,或繼續求值,直至被調用函數執行結束,函數執行永遠不會交叉進行.

3)如果函數參數是運算式,這些運算式通常可以按任何次序求值,包括交叉求值.

對於f(expr1, expr2) 編譯器可能先對expr1 求值,也可能後對expr1求值,或者讓expr1 和 expr2 的求值交叉進行

對於f(g(expr1),h(expr2)),expr1必須在g()被調用之前求值, expr2 必須在h()被調用前求值, g(),h()都必須在f()被調用之前執行完畢, expr1和 expr2 的求值可以交叉進行

一個順序點,被定義為程式執行過程中的這樣一個點:該點前的運算式的所有副作用,在程式執行到達該點之前發生完畢;該點後的運算式的所有副作用,在程式執行到該點時尚未發生。

(++i) + (++j)這個運算式本身不包含順序點,所以i++,j++這兩個“副作用”到底誰先發生,根據標準,是未定義的。如果給這個運算式加上順序點,如:
;(++i) + (++j);
標準只保證,這兩個副作用在整個運算式求值完成前(即到達後面的順序點";"前)都會發生,並且不會在上一個語句執行完畢之前發生。

標準還規定,兩個相鄰順序點之間,對某一運算式求值,最多隻能造成任一特定對象的值被更改一次。如果運算式求值過程會更改某對象的值,那麼要求更改前的值被讀取的唯一目的,只能是用來確定要存入的新值。
例如下面的運算式,按照標準規定,執行結果是未定義的:
(i++)+(i++)
這個運算式本身不包含任何順序點,但是對這個運算式求值,按照運算子定義,將更改i兩次,違反了“一次更改”的要求。
再看下面的運算式,按照標準規定,執行結果也是未定義的:
x[i]=i++
這個運算式本身不包含任何順序點,雖然i的值只更改了一次,但是x[i]這個左值中,i被讀取,用於確定數組中被修改的元素的下標。這次對i求值和i++ 肯定位於同一對順序點之間,該運算式求值過程更改了i的值,x[i]中讀取i卻不是為了確定i的新值,這違反了“讀取只能用於確定新值”規定。

任何對相鄰順序點間運算式求值的多個副作用發生的順序進行假設,或者違反上述“一次更改、讀取僅用於確定新值”規定的代碼,其執行結果都是未定義的。這裡所說的“未定義”,通常比“不可移植”更嚴重,可以認為是“錯誤”的同意詞。

通常我們認為,標準對“順序點”及其語義的定義,是為了嚴謹地定義C/C++的運算式和求值過程,並不是為了讓程式員通過對順序點的掌握,(過分地)利用運算式求值的副作用。實際工作中,我們完全可以通過引入中間變數,避開“順序點”這樣容易出錯,也極大地降低代碼可讀性的“邊緣概念”。
sample
f(new T1, new T2)
編譯器產生代碼1:

1)為T1分配記憶體

2)構造T1

3)為T2分配記憶體

4)構造T2

5)調用f()

如果第三步,或第四步失敗,C++標準不會要求T1對象被摧毀並釋放記憶體。

編譯器產生代碼2

1)為T1分配記憶體

2)為T2分配記憶體

3)構造T1

4)構造T2

5)調用f()

如果第三步失敗 T1記憶體會被釋放, C++標準並沒有要求釋放T2記憶體, 如果第四步失敗, T1已經被完全構造,但是C++標準並沒有要求將其摧毀並釋放記憶體。
正確方法:

auto_ptr<T1> t1(new T1);

auto_ptr<T2> t1(new T2);

f(t1,t2);

在一個運算式中,如果其他代碼有可能跑出異常,就絕對不要在這個運算式中分配資源, 即使通過new獲得的資源立即在同一運算式中被管理起來。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.