在缓冲区之间移动字符串时,我经常将char*
视为数据缓冲区,并且不使用字符串缓冲区(strncpy
,strncat
等)。
示例:
memcpy(target, src, strlen(src) + 1) // after buffer size checks
//vs
strncpy(target, src, target_size - 1);
target[target_size - 1] = 0;
这是一种不好的做法吗?
编辑:我知道区别,这不是重复,而是标准实践的问题。答案 0 :(得分:3)
使用
memcpy(target, src, strlen(src) + 1) // after buffer size checks
可能涉及遍历字符串两次 - 一次在strlen
中,一次在memcpy
中。如果使用strcpy
,则可以获得很小的性能提升。
如果您出于无关原因计算字符串的长度或者使用其他资源的字符串长度,我不清楚memcpy
是好于还是差于strncpy
。
如果由于其他原因没有计算字符串的长度或者没有其他资源的字符串长度,最好使用strcpy
代替memcpy
或strncpy
。
答案 1 :(得分:1)
如果你知道语义和大小,那就不是问题了。请记住strncpy将在第一个空值处停止并且还填充目标中的以下字节,如果字符串较短,则填充空字节的n个字符(如果源中没有字符串,则不会写入空字节) 。 strncpy还可以为您提供更好的类型检查,因为它在所有情况下都需要char *
,而不是void *
。
哪个更高效是有争议的,但基于可以在一条指令中复制整个内存块的CPU批量指令,memcpy可能更快,因为strncpy会检查NUL
个字符的每个复制字节