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