gpt4 book ai didi

c++ - 默认情况下,为什么 C++ 不检测何时使用 [ ] 运算符访问超出范围的 vector 元素?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:25:49 26 4
gpt4 key购买 nike

我知道数组是一个原始类,因此没有内置方法来检测超出范围的错误。但是, vector 类具有内置函数 .at() 可以检测到这些错误。通过使用 namespace ,任何人都可以重载 [ ] 符号以充当 .at() 函数,方法是在访问 vector 范围之外的值时抛出错误。我的问题是:为什么这个功能在 C++ 中不是默认的?

编辑:下面是重载 vector 运算符 [ ] 的伪代码示例(我相信 - 如果需要请纠正我):

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]; }

此函数转换为 just three lines of assembly :

    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++ 不检测何时使用 [ ] 运算符访问超出范围的 vector 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30181568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com