memory

std.memory

fun raw_fill

pub fun raw_fill(p: ptr, value: u8, size: usize);

用字节值填充一块原始内存

通过字节填充头部序言(prologue)以达到字对齐(word alignment),然后通过对齐的主体使用扩展到整个机器字的填充值进行存储,最后再填充尾部。字大小派生自 usize,因此该路径适配 32 位/64 位系统。

p:内存块起始位置的指针 value:要填充的字节值 size:要填充的字节数

fun raw_copy

pub fun raw_copy(dst: ptr, src: ptr, size: usize);

将一块原始内存从源复制到目标

srcdst 共享相同的对齐偏移量(对字大小取模)时,复制会先执行字节头部以达到对齐,接着在对齐的主体中进行整字加载/存储,最后执行字节尾部。对齐不匹配时会回退到普通的字节循环。字大小派生自 usize(32/64 位自适应)。

dst:目标内存块的指针 src:源内存块的指针 size:要复制的字节数

fun raw_move

pub fun raw_move(dst: ptr, src: ptr, size: usize);

复制一块原始内存,正确处理重叠区域

dst > src 时向后复制,以避免因重叠而导致数据损坏。对于非重叠区域,建议使用 raw_copy

保持按字节处理:向后(dst > src)分支在按字处理时并非理所当然的安全(它需要末端对齐推理以及颠倒的头/尾处理,这存在破坏重叠字节的风险),并且仅加速正向分支会将正确性与 raw_copy 未指定的纯正向顺序耦合。重叠时的正确性在这里优于吞吐量。

dst:目标内存块的指针 src:源内存块的指针 size:要复制的字节数

fun raw_zero

pub fun raw_zero(p: ptr, size: usize);

将一块原始内存清零

p:内存块起始位置的指针 size:要清零的字节数

fun fill

pub fun fill[T](p: *T, value: T, count: usize);

用类型 T 的值填充一块内存

p:内存块起始位置的指针 value:要填充的值 count:要填充的元素数量

fun copy

pub fun copy[T](dst: *T, src: *T, count: usize);

将一块内存从源复制到目标

dst:目标内存块的指针 src:源内存块的指针 count:要复制的元素数量

fun move

pub fun move[T](dst: *T, src: *T, count: usize);

复制一块带类型的内存,正确处理重叠区域

委托给 raw_move 来进行实际的字节级重叠复制。对于非重叠区域,建议使用 copy[T]

dst:目标内存块的指针 src:源内存块的指针 count:要复制的元素数量

fun zero

pub fun zero[T](p: *T, count: usize);

为类型 T 的若干元素将一块内存清零

p:内存块起始位置的指针 count:要清零的元素数量

fun raw_equal

pub fun raw_equal(a: ptr, b: ptr, n: usize) bool;

按字节比较两个原始内存块

ab 模字大小同对齐时,通过字节头部达到对齐,主体通过整字进行比较,最后进行字节尾部比较;对齐不匹配时会回退到普通的字节循环。字大小派生自 usize(32/64 位自适应)。

nil 契约:无论指针值如何,n==0 显然恒成立。相等的指针(包括 nil==nil)无需解引用即恒成立。如果恰好有一个指针为 niln>0,则结果为 false

a:第一个内存块的指针 b:第二个内存块的指针 n:要比较的字节数 返回值:如果 ab 的前 n 个字节完全相同则为 true

fun equal

pub fun equal[T](a: *T, b: *T, n: usize) bool;

ab 处比较 n 个带类型元素是否按字节相等

委托给 raw_equal;关于 nil 处理请参阅 raw_equal。如果字节计数会溢出 usize,则返回 false

a:第一个元素的指针 b:第二个元素的指针 n:要比较的元素数量 返回值:如果 ab 的前 n 个元素字节完全相同则为 true