【问题标题】:Are there memset function implementations that fill the buffer in reverse order?是否有以相反顺序填充缓冲区的 memset 函数实现?
【发布时间】:2018-05-19 03:34:39
【问题描述】:

我知道有memcpy 的实现,它以相反的顺序复制内存以针对某些处理器进行优化。有一次,一个错误“Strange sound on mp3 flash website”与此有关。嗯,这是一个有趣的故事,但我的问题是关于另一个函数。

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

附:我了解,就应用程序编程而言,缓冲区是按升序还是降序填充完全没有区别。但是,对我来说重要的是要找出是否有任何“反向”功能实现。我需要它来写一篇文章。

【问题讨论】:

  • 我投票结束这个问题,因为它不是一个真正的实际编程问题。 (用“不”来回答这个问题也是不可能的,FWIW。)
  • 可能有这样的实现,标准没有具体说明顺序。如果某些软件依赖于 memcpy 自上而下而不是自下而上复制的事实,那么该软件就坏了。
  • 向其他人(可能是程序员)询问与编写编程相关的信息似乎完全是话题。
  • 性能属性可能取决于它,例如就 memset 之后缓存中的新鲜内容而言。
  • 注意。我打算写这篇文章不是关于优化,而是关于程序中有趣的错误类型。找到“反向”memset 对我来说很有价值。那我可以举一个漂亮的例子。

标签: c++ c memset


【解决方案1】:

SuperH 架构的 Linux 内核 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,@-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,它们都是可预测的。有关详细信息,请参阅添加它的提交消息:

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

一些特定于架构的 asm 版本的 memset 也具有此属性:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2013-10-28
    相关资源
    最近更新 更多