Почему эта якобы бесконечная программа l oop завершается? - PullRequest
0 голосов
/ 15 апреля 2020

Я говорил с моим другом об этих двух частях кода. Он сказал, что python завершается, а C ++ - нет.

Python:

arr = [1, 2, 3]
for i in range(len(arr)):
  arr.append(i)
print("done")

C ++:

#include <iostream>
#include <vector>
using namespace std;

int main() {
  vector<int> arr{1,2,3};
  for(int i = 0; i < arr.size(); i++){
    arr.push_back(i);
  }
  cout << "done" << endl;
  return 0;
}

Я бросил вызов этому и запустил его на 2 компьютерах. Первый исчерпал память (плохо allo c), потому что у него было 4 ГБ оперативной памяти. Моя мама c как 12 ГБ оперативной памяти, и она была в состоянии бежать и заканчивать просто отлично. Я думал, что это не будет работать вечно, потому что тип size () в векторе - это unsigned int. Так как моя ma c была 64-битной, я думал, что она может хранить 2 ^ (64-2) = 2 ^ 62 дюйма (что верно), но без знака int для размера по какой-то причине 32.

Это какая-то ошибка в компиляторе C ++, которая не изменяет max_size () относительно аппаратного обеспечения системы? Переполнение вызывает завершение программы. Или это по какой-то другой причине?

1 Ответ

2 голосов
/ 15 апреля 2020

В вашем компиляторе C ++ нет ошибки, проявляющейся здесь.

int переполнен (из-за i++), поведение которого не определено. (Возможно, вам не хватит памяти на некоторых платформах до того, как произойдет это переполнение.) Обратите внимание, что не существует определенного поведения, которое сделает i отрицательным, хотя это часто встречается на машинах с целочисленными типами со знаком 2 в дополнение std::numeric_limits<int>::max() достигается, и если бы i было -1, скажем, тогда i < arr.size() было бы false из-за неявного преобразования i в тип unsigned.

Python версия предварительно вычисляет range(len(arr)); последующие добавления не изменяют это начальное значение.

...