我最近遇到了一些遗留代码,并注意到有时(并非总是)以下代码段需要很长时间才能执行。
#define NUM_OF_RECORDS 100000
char* pzBuffer = new char[NUM_OF_RECORDS + 1];
strncpy(pzBuffer, "", NUM_OF_RECORDS);
目标似乎是初始化pzBuffer,我同意memcpy或memset是更好的选择。我想弄清楚为什么花时间以及这里的用法是否正确。
答案 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);