【问题标题】:Do different/older processors run c++ code differently? [closed]不同/较旧的处理器是否以不同的方式运行 c++ 代码? [关闭]
【发布时间】:2020-02-20 02:17:10
【问题描述】:

我正在编写一个循环遍历二维数组的函数,如果数组中的当前元素小于它旁边的元素,那么我会将 1 添加到我的 int 计数器变量。问题是,当我使用 AMD ryzen 7 处理器在基于 Windows 的机器上运行代码时,它工作正常并且计数器变为 20(在 5x5 阵列上)。但是,当我在配备英特尔酷睿 i5 处理器的 2014 Macbook 上运行它时,在 MacOS 和 Windows 10(bootcamp)上,使用相同的代码块,计数器只能达到 19。这是我的循环

int counter = 0;
for(int i=0; i < ROWS; i++){
    for(int j=0; j < COLUMNS; j++){
        if(board[i][j] < board[i][j + 1]){
            counter += 1;
        }
    }
}

我认为这适用于任何情况。

【问题讨论】:

  • board的内容从何而来?两个测试都一样吗?
  • 应该的。因此,某处必须存在未定义的行为。不幸的是,如果没有minimal reproducible example 任何人都可以剪切/粘贴并重现您观察到的结果,那么没有人能够进一步帮助您。
  • 如果您的板子有 COLUMNS 列,那么 j+1 将超出其边界,因此您将获得未定义的行为。
  • 处理器不运行 C++ 代码。他们运行机器代码。不管你需要发minimal reproducible example
  • 处理器根本不运行 C++ 代码。您是重新编译代码以便在另一台计算机上运行它,还是使用相同的可执行文件?

标签: c++ processor


【解决方案1】:

如果能像其他人所说的那样有一个最小的可重现示例会很好,我想我可以从这里看到它。

使用j+1 将使索引超出范围,导致未定义的行为。
试试看:

for(int i=0; i < ROWS; i++){
  for(int j=0; j < COLUMNS - 1; j++){
    if(board[i][j] < board[i][j + 1]){
      counter += 1;
    }
  }
}

这应该可以避免这个问题,只需尽快停止一个

【讨论】:

  • 你不可能知道答案。建议是 cmets,而不是答案。另外,请注意他的问题实际上是什么。这甚至与他的实际问题无关。
  • board[ROWS][COLUMNS] 是一个可靠的假设。是的,OP 的代码在最后一步读取了一个虚假的值。 C++ is 在这两种环境中的执行方式是不同的,狭义的、反常的感觉是垃圾内存的内容是不同的。 UB 可能在 C++ 级别上未定义,但在这种特殊情况下,它仍然主要是确定性的,在编译器/构建/操作系统的限制内。
猜你喜欢
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2021-12-02
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多