仅作记录,以下模式使用memcpy(..)。假设我们想用 20 个整数填充一个数组:
--------------------
First copy one:
N-------------------
Then copy it to the neighbour:
NN------------------
Then copy them to make four:
NNNN----------------
And so on:
NNNNNNNN------------
NNNNNNNNNNNNNNNN----
Then copy enough to fill the array:
NNNNNNNNNNNNNNNNNNNN
这需要 O(lg(num)) 次 memcpy(..) 的应用。
int *memset_int(int *ptr, int value, size_t num) {
if (num < 1) return ptr;
memcpy(ptr, &value, sizeof(int));
size_t start = 1, step = 1;
for ( ; start + step <= num; start += step, step *= 2)
memcpy(ptr + start, ptr, sizeof(int) * step);
if (start < num)
memcpy(ptr + start, ptr, sizeof(int) * (num - start));
return ptr;
}
我认为如果 memcpy(..) 使用一些硬件块内存复制功能进行优化,它可能比循环更快,但事实证明,简单循环比使用 -O2 和 -O3 的循环更快。 (至少在 Windows 上使用 MinGW GCC 和我的特定硬件。)如果没有 -O 开关,在 400 MB 数组上,上面的代码大约是等效循环的两倍,在我的机器上需要 417 毫秒,而优化它们两者都达到约 300 毫秒。这意味着它花费的纳秒数与字节数大致相同,一个时钟周期约为一纳秒。所以要么我的机器上没有硬件块内存复制功能,要么memcpy(..)实现没有利用它。