1

関連する質問をいくつか 読みましたが、との速度比較については何もありません。 memcpystrncpy

クリティカル セクション内の文字列コンテンツを追跡するには、何をお勧めしますか?

  • 動的メモリ割り当てを避ける
  • コードの優雅さと読みやすさ/理解のしやすさ (コード行数が少ない)
  • 高速処理(少ない命令、分岐ミス防止)
  • コンパイラーによって最適化できる (または最適化された命令を既に使用している実装がある)

関数について考えていました:

  1. memcpy最小の長さを計算する必要があります ( coliru.stacked-crooked.comのスニペットを参照)

    void copy (char dst[20], const std::string& src)
    {
        if (src.size() < sizeof(dst)) {
            memcpy (dst, src.c_str(), src.size()+1);
        } else {
            memcpy (dst, src.data(), sizeof(dst)-1);
            dst[sizeof(dst)-1] = 0;
        }
    }
    
  2. strncpyヌル バイトの終端を検索し、不要な最終バイトをすべて埋める (スニペットを参照)

    void copy (const std::string src, char (*dst)[20])
    {
        strncpy (dst, src.c_str(), sizeof(dst)-1);
        dst[sizeof(dst)-1] = 0;
    }
    
  3. snprintf?

  4. std::string::copydypのコメントで示唆されているように...

  5. std::copy同じdypのコメントで再び示唆されているように...

  6. 他のアイデアはありますか?

ベンチマークは実行できますが、複数のコンパイラ/バージョン、異なるフラグ セット、および異なるハードウェア/OS に基づいている必要があります。あなたのフィードバック/背景/専門知識、または数学的な知識に基づいた回答を希望します...

これは一般的な質問であるため、同じ関連する質問を探している人は、私自身の特定の現在のケースではなく、一般的な回答を歓迎します.

参考までに、あるスレッドはファイル内にいくつかの内容を書き込む必要がありstd::string、その内容は別のスレッドによって変更される可能性があります。この別のスレッドを変更できません。この別のスレッドは非常にビジーです。文字列のコピーをロック (ミューテックス/スピンロック) しないと、問題が発生することがあります。std::stringしたがって、これらをすばやくコピーして、ロックセクションの後に書きたいと思います。

4

2 に答える 2

0

data() の代わりに c_str() を使用すると、std::string が一時的なコピーを作成して、終端の 0 をアタッチする危険があります。また、data() を使用すると、stncpy を使用できません。

その一時コピーを実際に行う実装が多数あるかどうかはわかりません。ターミネータのために 1 バイトを無駄にすることは、それほど大したことではないようです。しかし:

  • 純粋な C++ コードでは、c_str() は必要ありません。
  • 1 バイト無駄にするだけでなく、それを維持するための時間も必要です。
  • 一部の実装では、非常に短い文字列に余分な動的メモリを割り当てないようにしています。そこには、多かれ少なかれ1バイトを格納できることが重要です。
  • おそらく実装は、部分文字列操作のコピーオンライト最適化を行いますか?
于 2014-01-22T19:23:36.203 に答える