跳到主要内容

Julia 边界检查

阐述

Julia 代码中可以用 @boundscheck 标出涉及到边界检查的代码,对于内置类型和自定义类型都适用。

@inbounds 宏可以将被操作的代码中包含的 @boundscheck 或者内联到这段代码中的函数的 @boundscheck 移除。为了避免引起意外,内联只会处理一层,更深的内联就不会再处理了。

如果希望 @inbounds 可以穿透这层函数处理更深入的 @boundscheck,可以在定义的时候用 Base.@propagate_inbounds 来标注。

在绕过边界检查的情况下,程序可能会变得内存不安全,所以需要小心使用。

调用栈

  • checkbounds(A, I...) 调用
    • checkbounds(Bool, A, I...) 调用
      • checkbounds_indices(Bool, axes(A), I) 递归调用
        • checkindex 每一维度

对于自定义 Julia 阵列类型,

  • 一般情况下只要 axes 有定义,就可以使用
  • 如果有特殊的指标类型,可以特化 checkindex
  • 如果有特殊的多维指标类型,可以特化 checkbounds_indices
  • 一般情况下,可以特化 checkbounds(Bool, A, I...)

实例

function sum(A::AbstractArray)
r = zero(eltype(A))
for i in eachindex(A)
@inbounds r += A[i]
end
return r
end

性质

相关内容

参考文献