若要设置一块内存为指定值,最简单莫过于memset了,然而它要求pattern是一个字节,如果想设置一个宽点的类型,例如整型,那么memset基本就无法发挥功效,除非设置的是0或者-1或者其它值能满足所有字节一样。
下面提供几个方法,并大致比较一下:
1> 普通的for循环,一次设置数组各个元素为指定值
2> 滚动拷贝,1变2,2变4,4变8,越来越多……
3> Duff's Device, 达夫设备,是一个叫Duff的人发明的,将循环的比较次数降为1/8,将switch和while糅合在一起。
注意:所有函数都没有做参数检查,要求输入count必须大于0,否则会出错!
代码如下:
开了/O2优化,结果如下:
分析如下:
memcpy是被高度优化的(memsetPower中被调用),据说是用汇编写的,所以非常快,开不开/O2影响不大,而普通循环的影响很大,速度直逼memsetPower。而Duff's Device表现得非常令人吃惊,基本都是最快的。
当然我的环境可能有局限性,欢迎大家测试代码,找到最适合自己的方法。