当前位置:  开发笔记 > 编程语言 > 正文

使用现代编译器在C++中使用"memset"功能的状态

如何解决《使用现代编译器在C++中使用"memset"功能的状态》经验,为你挑选了3个好方法。

DDJ文章承认memset是最好的答案,并且比他试图实现的要快得多:

关于C的内存操作函数memset,memcpy和memcmp有一些神圣不可侵犯的东西.它们很可能由编译器供应商高度优化,以至于编译器可能检测到对这些函数的调用并用内联汇编程序指令替换它们 - 这就是MSVC的情况.

因此,如果memset适合您(即您使用单个字节初始化),则使用它.

虽然每毫秒可能有效,但您应该确定在设置内存时丢失执行时间的百分比.考虑到您还有很多有用的工作,它可能非常低(1或2%??).鉴于优化工作可能会在其他地方获得更好的回报率.



1> Rob Walker..:

DDJ文章承认memset是最好的答案,并且比他试图实现的要快得多:

关于C的内存操作函数memset,memcpy和memcmp有一些神圣不可侵犯的东西.它们很可能由编译器供应商高度优化,以至于编译器可能检测到对这些函数的调用并用内联汇编程序指令替换它们 - 这就是MSVC的情况.

因此,如果memset适合您(即您使用单个字节初始化),则使用它.

虽然每毫秒可能有效,但您应该确定在设置内存时丢失执行时间的百分比.考虑到您还有很多有用的工作,它可能非常低(1或2%??).鉴于优化工作可能会在其他地方获得更好的回报率.


在某些算法运行中,临时"辅助"数组的初始化可能占总运行时间的20%到40%.而且我的数据通常是多字节的,因此memset在这种情况下不起作用(我已经将它用于单字节数据).

2> Zooba..:

在MASM论坛有很多令人难以置信的汇编语言的程序员/谁已经完全击败这个问题到死亡爱好者(必须通过实验室看看).结果很像克里斯托弗的反应:SSE对于大型,对齐的缓冲区而言是令人难以置信的,但是下降到最终会达到如此小的尺寸,以至于基本for循环同样快.



3> Christopher..:

Memset/memcpy主要是用基本指令集编写的,因此可以通过专门的SSE例程来表现,而另一方面,它强制执行某些对齐约束.

但要将其减少到列表:

    对于数据集<=几百千字节,memcpy/memset比你可以模拟的任何东西都要快.

    对于数据集>兆字节,使用memcpy/memset的组合来获得对齐,然后使用您自己的SSE优化例程/回退来优化来自Intel等的例程.

    在启动时强制对齐并使用您自己的SSE例程.

此列表仅适用于需要演奏的场合.太小/或一次初始化的数据集不值得麻烦.

这是一个来自AMD的memcpy的实现,我找不到描述代码背后概念的文章.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有