是否存在以相反顺序填充缓冲区的memset函数实现?

And*_*pov 14 c c++ memset

我知道有一些实现memcpy,它们以相反的顺序复制内存以优化某些处理器.曾经有一个错误" mp3 flash网站上的奇怪声音 "与之相关.嗯,这是一个有趣的故事,但我的问题是另一个功能.

我想知道,memset世界上有一个函数,从最后开始填充缓冲区.很明显,理论上没有什么能阻止这样的函数实现.但我完全感兴趣的是,这个功能是在某个地方某人的实践中完成的.我将特别感谢库中具有这种功能的链接.

PS我明白,就应用程序编程而言,缓冲区是按升序还是降序填充完全没有区别.但是,重要的是要找出是否存在任何"反向"功能实现.我需要它写一篇文章.

R..*_*R.. 14

Linux内核的SuperH架构memset具有以下属性:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/sh/lib/memset.S?id=v4.14

据推测它是这样做的,因为mov指令存在于mov.l Rm,@-Rnprecrement form ()中而不是postincrement形式.看到:

http://shared-ptr.com/sh_insns.html

如果你想要一个在技术上不是独立实现的内核内部的东西,而是一个应用程序代码可以链接到的实际托管C实现,musl libc也有一个例子:

https://git.musl-libc.org/cgit/musl/tree/src/string/memset.c?id=v1.1.18

在这里,memset的C版本(在许多但不是所有目标arch上使用)实际上并不向后填充整个缓冲区,而是以减少条件分支数量并使它们全部可预测的方式从开始和结束开始对于非常小的memset.有关详细信息,请参阅添加它的提交消息:

https://git.musl-libc.org/cgit/musl/commit/src/string/memset.c?id=a543369e3b06a51eacd392c738fc10c5267a195f

某些特定于arch的asm版本的memset也具有以下属性:

https://git.musl-libc.org/cgit/musl/tree/src/string/x86_64/memset.s?id=v1.1.18