strncpy花了很长时间

时间:2017-06-18 15:09:27

标签: c++ strncpy

我最近遇到了一些遗留代码,并注意到有时(并非总是)以下代码段需要很长时间才能执行。

#define NUM_OF_RECORDS 100000
char* pzBuffer = new char[NUM_OF_RECORDS + 1];
strncpy(pzBuffer, "", NUM_OF_RECORDS);

目标似乎是初始化pzBuffer,我同意memcpy或memset是更好的选择。我想弄清楚为什么花时间以及这里的用法是否正确。

2 个答案:

答案 0 :(得分:0)

使用memset()可以做得更好,原因如下:

1)strncpy()适用于个人' char'级别意味着它将逐个遍历所有字符(在您的情况下为~NUM_OF_RECORDS次迭代)。

2)memset()在块级工作,其中块由N个字节组成。虽然这意味着遍历块的单个字节,但此函数是为w.r.t优化而设计的。大块尺寸,当涉及大尺寸的块时,通常会产生更好的性能。

我建议使用memset 2)创建代码的变体1)使用strncpy。然后,编译它们以生成汇编代码,并找出指令之间的区别。

答案 1 :(得分:-2)

http://unix.superglobalmegacorp.com/BSD4.4Lite/newsrc/libkern/strncpy.c.html

像strncpy的标准实现一样,用零填充数组的所有剩余元素,无论如何。所以,这需要时间,。

    do {
        if ((*d++ = *s++) == 0) {
            /* NUL pad the remaining n-1 bytes */
            while (--n != 0)
                *d++ = 0;
            break;
        }
    } while (--n != 0);