[英]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.