3 回答

TA貢獻1805條經(jīng)驗 獲得超9個贊
有人能很好地解釋為什么這是必要的嗎?
正如N 1509正確指出的那樣,當前的草案本質(zhì)上給出了6.8.5p6中無限循環(huán)的未定義行為。這樣做的一個主要問題是,它允許代碼在一個潛在的非終止循環(huán)中移動。例如,假設我們有以下循環(huán),其中Count和Count 2是全局變量(或已獲取它們的地址),而p是局部變量,其地址尚未被接受: for (p = q; p != 0; p = p -> next) { ++count;}for (p = q; p != 0; p = p -> next) { ++count2;}
這兩個循環(huán)能被合并替換為下面的循環(huán)嗎? for (p = q; p != 0; p = p -> next) { ++count; ++count2;}
如果沒有6.8.5p6中對無限循環(huán)的特殊分配,這將是不允許的:如果第一個循環(huán)沒有因為q指向循環(huán)列表而終止,那么原始循環(huán)就不會寫到Count 2。因此,它可以與訪問或更新Count 2的另一個線程并行運行。對于轉(zhuǎn)換后的版本來說,這已經(jīng)不再安全了,盡管存在無限循環(huán),但它仍然可以訪問Count 2。因此,轉(zhuǎn)換可能會引入數(shù)據(jù)競爭。
在這種情況下,編譯器很難證明循環(huán)終止;它必須理解Q指向一個非循環(huán)列表,我認為這超出了大多數(shù)主流編譯器的能力,而且沒有完整的程序信息通常是不可能的。
非終止循環(huán)所施加的限制是對編譯器無法證明終止的終止循環(huán)的優(yōu)化的限制,也是對實際非終止循環(huán)的優(yōu)化的限制。前者比后者更常見,而優(yōu)化往往更有趣。
顯然還有帶有整數(shù)循環(huán)變量的for-循環(huán),編譯器很難證明終止,因此編譯器很難在沒有6.8.5p6的情況下重構(gòu)循環(huán)。甚至像 for (i = 1; i != 15; i += 2)
或 for (i = 1; i <= 10; i += j)
似乎很難處理。(在前一種情況下,需要一些基本的數(shù)論來證明終止,在后一種情況下,我們需要了解j的可能值。對無符號整數(shù)的環(huán)繞可能會進一步使這種推理復雜化。)
這個問題似乎適用于幾乎所有的循環(huán)重構(gòu)轉(zhuǎn)換,包括編譯器并行化和緩存優(yōu)化轉(zhuǎn)換,這兩種轉(zhuǎn)換都很可能變得重要,而且對數(shù)值代碼通常也很重要。這似乎會變成一筆巨大的成本,以便能夠以最自然的方式編寫無限循環(huán),特別是因為我們大多數(shù)人很少有意識地編寫無限循環(huán)。

TA貢獻1830條經(jīng)驗 獲得超3個贊
這是為了允許編譯器轉(zhuǎn)換-mdash;,例如刪除空循環(huán),即使終止不能被證明。
while (complicated_condition()) { x = complicated_but_externally_invisible_operation(x);}complex_io_operation();cout << "Results:" << endl;cout << x << endl;
complex_io_operation
complex_io_operation()

TA貢獻1852條經(jīng)驗 獲得超1個贊
main
- 3 回答
- 0 關(guān)注
- 538 瀏覽
添加回答
舉報