関連する質問をいくつか 読みましたが、との速度比較については何もありません。 memcpy
strncpy
クリティカル セクション内の文字列コンテンツを追跡するには、何をお勧めしますか?
- 動的メモリ割り当てを避ける
- コードの優雅さと読みやすさ/理解のしやすさ (コード行数が少ない)
- 高速処理(少ない命令、分岐ミス防止)
- コンパイラーによって最適化できる (または最適化された命令を既に使用している実装がある)
私はc関数について考えていました:
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; } }
strncpy
ヌル バイトの終端を検索し、不要な最終バイトをすべて埋める (スニペットを参照)void copy (const std::string src, char (*dst)[20]) { strncpy (dst, src.c_str(), sizeof(dst)-1); dst[sizeof(dst)-1] = 0; }
std::string::copy
dypのコメントで示唆されているように...他のアイデアはありますか?
ベンチマークは実行できますが、複数のコンパイラ/バージョン、異なるフラグ セット、および異なるハードウェア/OS に基づいている必要があります。あなたのフィードバック/背景/専門知識、または数学的な知識に基づいた回答を希望します...
これは一般的な質問であるため、同じ関連する質問を探している人は、私自身の特定の現在のケースではなく、一般的な回答を歓迎します.
参考までに、あるスレッドはファイル内にいくつかの内容を書き込む必要がありstd::string
、その内容は別のスレッドによって変更される可能性があります。この別のスレッドを変更できません。この別のスレッドは非常にビジーです。文字列のコピーをロック (ミューテックス/スピンロック) しないと、問題が発生することがあります。std::string
したがって、これらをすばやくコピーして、ロックセクションの後に書きたいと思います。