首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过溢出中断实现循环边界检查

通过溢出中断实现循环边界检查
EN

Stack Overflow用户
提问于 2019-11-10 17:09:19
回答 1查看 82关注 0票数 1

今天,我有了这样的想法:通过构造一个迭代计数器,在最后一个增量上溢出并根据生成的溢出中断停止执行,就可以在数组上实现一个边界检查循环。

因此,假设您有一个数组,例如int[32],并且要迭代它。为了避免每次循环运行中的边界检查,您现在可以做的是为溢出中断注册一个中断处理程序,并将一个寄存器分配给值MAX - 32。该寄存器在每次循环迭代运行时递增,最后一次迭代运行将溢出,即触发中断处理程序。假设中断处理程序可以增加原始函数的程序计数器,这种机制可以用来避免边界检查。

所以代码就像

代码语言:javascript
运行
复制
for (int i = 0; i < array.length; i++) {
  // do something
}

可以像这样实现

代码语言:javascript
运行
复制
// setup interrupt somehow
SOME_REGISTER = MAX - array.length;
while (true) {
  // do something
  SOME_REGISTER++;
}

我不知道这是否可行,但我听说Java正在做类似的事情,以避免在运行时生成的代码中进行空检查。您认为这是可行的吗,还是任何语言运行时都考虑过/尝试过?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-10 17:39:03

处理异常非常缓慢,;即使可以在循环中保存指令,数组也必须是巨大的,才能通过故障来摊销离开循环的额外成本。

您可能已经读到的是Array bounds checks on 64-bit hardware using hardware memory-protection使数组在虚拟页面的末尾结束,而下一个页面没有映射。VM捕获SIGSEGV,并在出现越界异常时将异常传递给来宾代码。这消除了对随机访问的边界检查的需要,而不是在循环中。

这种技术只会导致无效的页面错误(分段错误),当来宾代码实际接受数组边界异常时, 而不是用于正常情况下退出数组上的循环.

让我们来看看你的想法将如何运作(而不是):

我认为您是在讨论MIPS,在这里有一个addi指令,可以捕获签名溢出。(而不是没有条件陷阱的普通addiu )。

大多数其他ISAs没有任何有效的方法在签名溢出时出错。x86有into (设置了中断of OF is ),但这是可能设置标志的add的单独指令。您最好使用条件分支,而不是导致异常并捕获它。或者只使用dec ecx / jnz作为循环计数器,或者将负索引从数组的末尾数到零和索引。

我认为MIPS需要在循环中为专用计数器增加一个addi:MIPS的唯一寻址模式是reg+16_bit_constant

因此,如果您想迭代一个数组,您需要一个指针增量,否则需要在循环中添加一个额外的add tmp, base, index

循环在底部需要跳转或分支指令,它可以是一个条件分支,基本上不需要额外的。因此,在MIPS中,您可以在循环之外计算数组的末尾,然后编写一个普通的循环,如

代码语言:javascript
运行
复制
    addu   $t5, $t0, $t4     ; t5 = int *endp = start + byte_length
.loop:                       ; do{
    addiu  $t0, $t0, 4         ;  p++
    lw     $t1, ($t0)          ; *p
    ...
    bne    $t0, $t5, .loop    ; }while(p != endp)

循环中没有浪费的指令。任何数组边界检查都可以在循环之外进行,方法是检查endp在数组结束后不超过一个。

(在现代x86上,cmp/jne可以等效地工作,对单个比较分支uop进行解码。许多其他ISAs都有一个减少和分支或类似的指令,允许计数器循环条件只有一个开销指令。)

作为循环条件的i < array.length不仅仅是数组边界检查。

正如我前面所说的,在一个迭代arr[i]的简单循环中,您可以提升边界--检查出循环,以保持循环的效率。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58791008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档