簡體   English   中英

如果使用優化(-O2,-O3),為什么此代碼的行為會有所不同?

[英]Why does this code behave differently if optimizing (-O2, -O3) is used?

我必須編寫一些檢查例程,如果使用-O0,-O1,-O2或-O3,它們的行為似乎不同。

下面我創建了一個適用於-O0和-O1的最小示例。 但是使用-O2或-O3時行為發生了變化。 在-O0和-O1情況下,for循環遞增整數,並且第一次達到最大值時,發生溢出並且檢查例程觸發。 在另一種情況下,for循環永遠不會中斷,盡管整數變為負數。

#include <iostream>

inline bool check(const int i) {
  if (i < 0)
    return false;
  else
    return true;
}

int main() {
  for (int i = 0;; i += 50000000) {
    std::cout << i << std::endl;
    const bool succ = check(i);
    if (succ == false) {
      std::cout << "Overflow: " << i << std::endl;
      break;
    }
  }
  return 0;
}

為什么編譯器允許優化它?

嘗試使用gcc,clang和icc,只有icc在所有優化變體中都能正確,其他兩個沒有。

有符號整數溢出會產生未定義的行為 因此,編譯器可以自由地執行這種情況,因為他們喜歡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM