簡體   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