为什么默认情况下使用 [ ] 运算符访问超出范围的矢量元素时,C++检测?
Why doesn't C++ detect when out of range vector elements are accessed with the [ ] operators by default?
我知道数组是原始类,因此没有内置的方法来检测范围错误。但是,矢量类具有内置函数.at(),它确实检测到这些错误。通过使用名称空间,任何人都可以通过在访问向量范围的值时丢弃错误来超载[]符号以充当.at()函数。我的问题是:为什么此功能不是C 中的默认值?
编辑:以下是伪代码中的一个示例(我相信 - 如果需要,请纠正我)超载矢量运算符[]:
Item_Type& operator[](size_t index) { // Verify that the index is legal.
if (index < 0 || index >= num_items) {
throw std::out_of_range
("index to operator[] is out of range");
}
return the_data[index]
}
我相信此功能可以写入用户定义的名称空间中,并且很容易实现。如果这是真的,为什么不默认?
通常与[]
一样便宜的东西,范围检查增加了一个重要的开销。
考虑
int f1(const std::vector<int> & v, std:size_t s) { return v[s]; }
此功能仅转化为三行组装:
movq (%rdi), %rax
movl (%rax,%rsi,4), %eax
ret
现在使用at()
考虑界限检查版本:
int f2(const std::vector<int> & v, std:size_t s) { return v.at(s); }
这变成
movq (%rdi), %rax
movq 8(%rdi), %rdx
subq %rax, %rdx
sarq $2, %rdx
cmpq %rdx, %rsi
jae .L6
movl (%rax,%rsi,4), %eax
ret
.L6:
pushq %rax
movl $.LC1, %edi
xorl %eax, %eax
call std::__throw_out_of_range_fmt(char const*, ...)
即使在普通(非启动)代码路径中,这是8行组装 - 几乎是
c 的原则仅为您使用的东西付费。因此,不受组织的操作绝对有自己的位置;仅仅因为您懒得谨慎对待自己的界限并不意味着我应该支付绩效罚款。
历史上的数组[]
在C和C 中都没有选中。仅仅是因为10-20岁的语言使检查操作并不意味着C 需要做出如此基本的向后兼容更改。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- 使用CMake检测支持的C++标准
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 当套接字连接断开时检测C/C++Unix
- 逐个元素检测数组中的更改
- 如何在地图迭代器中检测最后一个元素
- 为什么默认情况下使用 [ ] 运算符访问超出范围的矢量元素时,C++检测?
- 检测迭代器是否是std::map的最后一个元素
- Adjacent_find不检测最后两个元素
- Linux中的c++运行时错误::glibc检测到free():无效的下一个大小(快速):堆栈具有void ptr元素