我正在和我的朋友谈论这两段代码。他说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台计算机上运行了它。第一个内存不足(分配错误),因为它有4gb的ram。我的Mac为12gb的ram,它能够运行并终止得很好。 我认为它不会永远运行,因为vector中size()的类型是一个无符号的int。由于我的Mac是64位的,因此我认为它可以存储2 ^(64-2)= 2 ^ 62个整数(这是正确的),但是由于某种原因,大小的unsigned int是32。
C ++编译器中的这个bug是否不会将max_size()更改为相对于系统硬件的错误?溢出导致程序终止。还是其他原因?
答案 0 :(得分:2)
您的C ++编译器中没有bug会在此处显示。
int
溢出(由于i++
),其行为未定义。 (在这种情况下,在某些平台上用完内存是可行的。)请注意,没有定义的行为会使i
为负,尽管这在带有2的补码符号整数的机器上很常见。类型一旦获得std::numeric_limits<int>::max()
,并且如果i
为-1,则i < arr.size()
将为false
,因为i
隐式转换为{{1 }}类型。
Python版本会预先计算unsigned
;后续的附加操作不会更改该初始值。