我正在编写代码并意识到我可以"访问"与数组大小相同或更大索引的数组元素.为什么这不会产生错误?
例如,
#include <iostream>
using namespace std;
int main ()
{
int b_array[5] = {1, 2, 3, 4, 5};
cout << b_array[5] << endl // Returns 0
<< b_array[66] << endl; // Returns some apparently random value.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
唯一的技术答案是"因为C++语言规范说的".访问越界值是未定义的行为.你的个人品味无关紧要.
在"未定义的行为"背后(C++规范中有很多),需要让编译器开发人员根据他们必须运行的平台实现不同的优化.
如果您认为索引经常在循环中使用,如果检查边界,最终会检查每次迭代,总是成功(因此浪费处理器时间).
由于会产生性能损失,C++ 不实现边界检查。
例如vector,模板包含一个at()检查边界的函数,但比[]运算符慢约 5 倍。
低级语言往往迫使程序员编写安全且无错误的代码,以换取高性能。
| 归档时间: |
|
| 查看次数: |
1464 次 |
| 最近记录: |