【发布时间】:2019-04-19 14:05:06
【问题描述】:
memset() 非常快,因为它在内部受益于stosb 操作码。
是否有适用于 16 位和 32 位值的函数,可以有效地受益于 stosb、stosw 和/或 stosd?
wmemset() 不可移植,对 16 位值没有帮助。
【问题讨论】:
-
它适用于 256 个不同的 16 位和 32 位值,其中每个组件字节都具有相同的值,例如
0和-1(如果是二进制补码)。 -
stosw和stosd与stosb不同。在过去,所有这些指令都非常非常慢,因为它们在 uCode 级别上得到支持,并且为了向后兼容而保留。后来 Intel CPU 开始在硬件中实现stosb,以在硬件上提供高速memcpy,但stosw、stosd保持不变——基于uCode,因此非常慢。我认为没有任何变化,但我没有真正检查。 -
C++ 有
::std::fill编译器通常会以这种方式优化。 -
不幸的是我不能在我的项目中使用 C++ 函数。
-
你也可以阅读this关于
stosb和stosw/stosd之间区别的问题。这是我在之前的评论中谈到的。