2

そのメモリの浪費とCPU使用率の問題。

3 つの文字列をマージする場合:

  • アプローチ 1: すべての文字列の長さ (strlen) を取得してから割り当てる必要があります。

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

また

  • アプローチ 2:1025文字列が 1025 を超えないことを知っているという事実を考慮して、想定して割り当てる必要があります。

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

提案してください。

4

8 に答える 8

2

3 つの文字列すべてにメモリを割り当てる方が適切です。

ただし、文字列が固定長を超えないことを100% (非常に重要なので太字で示しています) 確信している場合は、先に進んでください。将来、最大長を超える可能性のあるものを追加する可能性があるかどうかを予測する必要があります。また、何らかの方法でユーザー入力が制限を超える可能性があるかどうかを考慮する必要があります。

すべてを必要としない場合は、固定バッファーを割り当て、残りの文字列が長すぎる場合は切り捨てることもできます。

文字列が非常に長くなる可能性がある場合 (数百 MB)、この方法を使用しないでください。この場合、ソリューションはアプリケーションによって異なります。

于 2012-05-28T07:59:52.013 に答える
1

あなたのmallocラインはうまく見えます。

固定長を想定した他の代替案の問題は、コード内の対応するすべての問題を変更せずに、後で固定長について気が変わる可能性があることです。

于 2012-05-28T07:57:44.343 に答える
1

率直に言って、2 を選択する場合は、(malloc ではなく) スタック割り当てをお勧めします。

#define MAX 1025
char s[MAX];
于 2012-05-28T08:06:00.213 に答える
1

すべての文字列の合計が <= 1024 になると仮定していますか?

この場合、1024 のメモリを割り当てる方が適切です (アプローチ 2)。このメモリは、何度でも再利用できます。

あなたのアプローチの問題 1; その特定のインスタンスの合計に基づいて、メモリを新たに再割り当てする必要があります。心配な場合、これにより CPU サイクルが増加します。

于 2012-05-28T08:10:37.620 に答える
1

合計サイズが 1025 または同様のかなり小さい値を超えることは決してないことが本当にわかっている場合は、可能であれば、代わりにスタックに文字列を割り当ててください。

OTOH、malloc を使用する場合は、前もって割り当てる必要がある量を把握するために、少し余分な作業を行うこともできます。この場合、strlen() ルートに進み、効率が心配なので、少なくとも strlen() 呼び出しの結果を保存し、str*() 関数の代わりに memcpy() を使用して結合された結果文字列を作成します。

于 2012-05-28T08:13:19.707 に答える
1

アプローチ 2: 1025 を想定し、文字列が 1025 を超えないことを知っているという事実を考慮して割り当てる必要があります。

はい、これは間違いなく。しかし、あなたは100%確信している必要があります。可能な限り、常に自動ストレージ割り当てを優先してください。

于 2012-05-28T08:01:19.737 に答える
1

どのくらいの頻度でこの操作を実行する必要がありますか?一度にメモリに保持する必要があるターゲット文字列の数は? それはすべて問題ではない可能性があります。char *my_strconcat3 (const char *s1, const char *s2, const char *s3);ただし、新しい文字列を返す関数に入れます。次に、状況が変化した場合にコードを変更する必要がある場所がコード内に 1 か所だけあります。

于 2012-05-28T08:49:48.030 に答える
1

C99では、文字列があまり大きくない場合は、これが好きです。

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

スタック内の可変長配列と呼ばれ、ヒープからメモリを確保する malloc よりも効率的です。

于 2012-05-28T08:55:25.023 に答える