[英]strcat vs strncat for string literal
我想将字符串文字附加到目标。 我可以使用strcat
或strncat
:
strcat(dest, "values");
要么
strncat(dest, "values", sizeof("values") - 1);
strcat
代码较短,看起来很整洁。
但是我想知道它们的运行时性能。
因为不需要定位终止符, strncat
在运行时是否会稍微快一些?
也许编译器可以进行优化,所以没有区别吗?
首先, strcat
和strncat
查找空终止符,不同之处在于strncat
还检查复制数据的大小,并且仅复制n
个字节。
其次,由于strcat
不会检查复制数据的大小,而是一直复制到空终止符,因此可能(并且将!!)导致缓冲区溢出,从而覆盖复制缓冲区之后存储在内存中的数据至。
第三,对strncat的使用并不安全,因为您将复制限制为源缓冲区而不是目标缓冲区的大小。 例如,要正确使用它,您应该传递目标缓冲区的大小:
strncat(dest, "values", sizeof(dest) -1 );
第四,如果源字符串的大小大于目标的n
,则不会附加空终止符,因此在对strncat
的调用之后,您应该自己添加它:
strncat(dest, "values", sizeof(dest) -1 );
dest[sizeof(dest) - 1] = '\0';
最后一件事,因为这是strncat,并且它将复制到目标字符串终止的任何地方,所以大小计算稍微复杂一些,实际上是:
strncat(dest, "values", total_size_of_dest_buffer - strlen(dest) - 1 );
因为不需要定位终止符,
strncat
在运行时是否会稍微快一些?
char *strncat(char * restrict s1, const char * restrict s2, size_t n);
不太可能。 通常,如果char *strncat()
在s2[n]
之前存在,则需要在s2
定位一个空字符 ,因为串联终止在n
字符之前。 当然,需要找到strcpy(s1,s2)
s2
中的空字符 。
strncat(dest, "values", sizeof("values") - 1);
可能比strcat(dest, "values");
慢 strcat(dest, "values");
而且不安全 。
不会超出可能会截断的数组的代码:
// Assuming dest is an array
strncat(dest, "values", sizeof dest - strlen(dest) - 1);
优化编译器可以“查找”下面的函数,并发出“知道”“值”的长度/大小的代码。 这样的编译器肯定会为下面的2做等效的性能代码,因为最终的功能是相同的-在这种情况下。
strcat(dest, "values");
// or
strncat(dest, "values", sizeof("values") - 1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.