是否有以相反顺序填充缓冲区的 memset 函数实现?
Are there memset function implementations that fill the buffer in reverse order?
我知道有 memcpy
的实现,它以相反的顺序复制内存以针对某些处理器进行优化。有一次,一个错误“Strange sound on mp3 flash website”与此有关。嗯,这是一个有趣的故事,但我的问题是关于另一个功能。
我很奇怪,世界上有一个memset
函数,它填充缓冲区,从末尾开始。很明显,理论上没有什么可以阻止执行这样的功能实现。但我真正感兴趣的是,这个功能是由某个地方的人在实践中完成的。 link库上有这样的功能,将不胜感激
P.S。据我所知,就应用程序编程而言,缓冲区是按升序还是降序填充完全没有区别。但是,找出是否有任何 "reverse" 功能实现对我来说很重要。我需要它来写一篇文章。
SuperH 架构的 Linux 内核 memset 有这个 属性:
大概是这样做的,因为mov指令以预减形式(mov.l Rm,@-Rn
)存在,而不是后递增形式。参见:
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 版本(用于许多但不是所有目标拱门)实际上并没有向后填充整个缓冲区,而是以减少条件分支数量的方式从开头和结尾开始并使它们对于非常小的内存集都是可预测的。有关详细信息,请参阅添加它的提交消息:
memset 的一些特定于 arch 的 asm 版本也有这个 属性:
https://git.musl-libc.org/cgit/musl/tree/src/string/x86_64/memset.s?id=v1.1.18
我知道有 memcpy
的实现,它以相反的顺序复制内存以针对某些处理器进行优化。有一次,一个错误“Strange sound on mp3 flash website”与此有关。嗯,这是一个有趣的故事,但我的问题是关于另一个功能。
我很奇怪,世界上有一个memset
函数,它填充缓冲区,从末尾开始。很明显,理论上没有什么可以阻止执行这样的功能实现。但我真正感兴趣的是,这个功能是由某个地方的人在实践中完成的。 link库上有这样的功能,将不胜感激
P.S。据我所知,就应用程序编程而言,缓冲区是按升序还是降序填充完全没有区别。但是,找出是否有任何 "reverse" 功能实现对我来说很重要。我需要它来写一篇文章。
SuperH 架构的 Linux 内核 memset 有这个 属性:
大概是这样做的,因为mov指令以预减形式(mov.l Rm,@-Rn
)存在,而不是后递增形式。参见:
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 版本(用于许多但不是所有目标拱门)实际上并没有向后填充整个缓冲区,而是以减少条件分支数量的方式从开头和结尾开始并使它们对于非常小的内存集都是可预测的。有关详细信息,请参阅添加它的提交消息:
memset 的一些特定于 arch 的 asm 版本也有这个 属性:
https://git.musl-libc.org/cgit/musl/tree/src/string/x86_64/memset.s?id=v1.1.18