繁体   English   中英

strcat vs strncat用于字符串文字

[英]strcat vs strncat for string literal

我想将字符串文字附加到目标。 我可以使用strcatstrncat

strcat(dest, "values");

要么

strncat(dest, "values", sizeof("values") - 1);

strcat代码较短,看起来很整洁。

但是我想知道它们的运行时性能。

因为不需要定位终止符, strncat在运行时是否会稍微快一些?

也许编译器可以进行优化,所以没有区别吗?

首先, strcatstrncat查找空终止符,不同之处在于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 );
  1. 我绝对确定,这里的性能不是问题。
  2. 如果查看一下strcpy()strncpy()这两个函数的源代码(来自glibc),您会发现它们都需要遍历src参数的每个字符。
  3. 使用strcpy()可以更轻松地读取和维护它,并且不易出错。

另外,如果有什么可以优化此代码的,我想任何不错的编译器都可以处理,因为这似乎很常见。

因为不需要定位终止符, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM