2012-05-28 100 views
2

其內存浪費與CPU利用率問題。在C函數中分配內存

如果我想合併3個字符串:

  • 方法1:我應該採取所有字符串長度(strlen的),然後分配。

    char *s = malloc(strlen(s1)+strlen(s2)+strlen(s3)+1); 
    

OR

  • 方法2:我應該承擔1025和分配考慮的事實,我知道該字符串將永遠超越1025

    #define MAX 1025 
    char *s = malloc(MAX); 
    

請建議。

回答

2

爲所有3個字符串分配內存效果更好。

但是,如果你是100%(粗體,因爲它非常重要)確保字符串永遠不會超過固定長度,然後繼續。您必須預測您是否可能在未來增加可能超過最大長度的內容,並且您必須考慮用戶輸入是否可以超出限制。

如果你可能不需要所有的東西,你也可以分配固定的緩衝區,如果太長,可以截斷其餘的字符串。

如果字符串有可能長得很長(幾百MB),那麼你不應該使用這種方法。在這種情況下,解決方案取決於您的應用程序。

1

你的malloc行看起來不錯。

假設一個固定長度,您的其他備選方案的問題是您可能稍後改變主意而不改變固定長度的所有相應問題。

1

方法2:我應該承擔1025和分配考慮的事實,我知道該字符串將永遠超越1025

是的,這肯定是一個。但你肯定是100%。如果可以,始終更喜歡自動存儲分配。

+0

但是'strlen'操作代價高昂?我的意思是說,只是爲了安全起見,我會採取措施1,那麼在那種情況下,它會以任何方式變得昂貴? – nimish

+0

@nimish你需要分析你的代碼。 –

+0

@nimish如果你僅僅調用一次,幾千個程序就不會減慢你的程序的速度。 – nhahtdh

1

坦率地說,如果你要選擇2,那麼我建議堆棧分配(而不是malloc的):

#define MAX 1025 
char s[MAX]; 
+0

如果MAX最小隻有幾KB。 – nhahtdh

1

我假設總和的所有字符串的將是< = 1024?

在這種情況下,您最好爲1024分配內存(方法2)。這個內存你可以反覆使用。

問題與你的方法1;您必須根據該特定實例的總數重新分配內存。如果您擔心,這會增加您的CPU週期。

1

如果你真的知道總大小將永遠不會超過1025或類似的相當小的值,如果可能的話,通過所有方法分配堆棧中的字符串。

OTOH,如果你打算使用malloc,那麼你不妨做一點額外的工作來弄清楚你需要多少分配。在這種情況下,當你走strlen()路線並擔心效率問題時,至少要存儲strlen()調用的結果,並使用memcpy()構建組合結果字符串,而不是str *()函數。

1

您需要多長時間執行一次該操作,需要一次將多少個目標字符串保存在內存中?有可能這一切都沒有關係。但是,將其放入一個函數char *my_strconcat3 (const char *s1, const char *s2, const char *s3);中即可返回新的字符串。然後,如果情況發生變化,您的代碼中只有一個位置需要更改。

1

在C99中,如果字符串是沒有那麼大,我喜歡這個,

len = strlen(s1)+strlen(s2)+strlen(s3)+1; 
char s[len]; 

它被稱爲可變長度數組中堆比的malloc效率更高誰從堆分配內存。

+0

僅適用於C99。 – nhahtdh