pub fun raw_fill(p: ptr, value: u8, size: usize);
用字节值填充一块原始内存
通过字节填充头部序言(prologue)以达到字对齐(word alignment),然后通过对齐的主体使用扩展到整个机器字的填充值进行存储,最后再填充尾部。字大小派生自 usize,因此该路径适配 32 位/64 位系统。
p:内存块起始位置的指针 value:要填充的字节值 size:要填充的字节数
pub fun raw_copy(dst: ptr, src: ptr, size: usize);
将一块原始内存从源复制到目标
当 src 和 dst 共享相同的对齐偏移量(对字大小取模)时,复制会先执行字节头部以达到对齐,接着在对齐的主体中进行整字加载/存储,最后执行字节尾部。对齐不匹配时会回退到普通的字节循环。字大小派生自 usize(32/64 位自适应)。
dst:目标内存块的指针 src:源内存块的指针 size:要复制的字节数
pub fun raw_move(dst: ptr, src: ptr, size: usize);
复制一块原始内存,正确处理重叠区域
当 dst > src 时向后复制,以避免因重叠而导致数据损坏。对于非重叠区域,建议使用 raw_copy。
保持按字节处理:向后(dst > src)分支在按字处理时并非理所当然的安全(它需要末端对齐推理以及颠倒的头/尾处理,这存在破坏重叠字节的风险),并且仅加速正向分支会将正确性与 raw_copy 未指定的纯正向顺序耦合。重叠时的正确性在这里优于吞吐量。
dst:目标内存块的指针 src:源内存块的指针 size:要复制的字节数
pub fun raw_zero(p: ptr, size: usize);
将一块原始内存清零
p:内存块起始位置的指针 size:要清零的字节数
pub fun fill[T](p: *T, value: T, count: usize);
用类型 T 的值填充一块内存
p:内存块起始位置的指针 value:要填充的值 count:要填充的元素数量
pub fun copy[T](dst: *T, src: *T, count: usize);
将一块内存从源复制到目标
dst:目标内存块的指针 src:源内存块的指针 count:要复制的元素数量
pub fun move[T](dst: *T, src: *T, count: usize);
复制一块带类型的内存,正确处理重叠区域
委托给 raw_move 来进行实际的字节级重叠复制。对于非重叠区域,建议使用 copy[T]。
dst:目标内存块的指针 src:源内存块的指针 count:要复制的元素数量
pub fun zero[T](p: *T, count: usize);
为类型 T 的若干元素将一块内存清零
p:内存块起始位置的指针 count:要清零的元素数量
pub fun raw_equal(a: ptr, b: ptr, n: usize) bool;
按字节比较两个原始内存块
当 a 和 b 模字大小同对齐时,通过字节头部达到对齐,主体通过整字进行比较,最后进行字节尾部比较;对齐不匹配时会回退到普通的字节循环。字大小派生自 usize(32/64 位自适应)。
nil 契约:无论指针值如何,n==0 显然恒成立。相等的指针(包括 nil==nil)无需解引用即恒成立。如果恰好有一个指针为 nil 且 n>0,则结果为 false。
a:第一个内存块的指针 b:第二个内存块的指针 n:要比较的字节数 返回值:如果 a 和 b 的前 n 个字节完全相同则为 true
pub fun equal[T](a: *T, b: *T, n: usize) bool;
在 a 和 b 处比较 n 个带类型元素是否按字节相等
委托给 raw_equal;关于 nil 处理请参阅 raw_equal。如果字节计数会溢出 usize,则返回 false。
a:第一个元素的指针 b:第二个元素的指针 n:要比较的元素数量 返回值:如果 a 和 b 的前 n 个元素字节完全相同则为 true