現代のC++文字列にポインタを使用することをお勧めしますか?このよう :テスト変数でC++の最新の文字列ポインタ
std::string *test = new string();
anyfunction(test);
は非常に長いテキストです。だから私は、ポインタを使って行動する方が簡単で速いと思っていました。
これは良いコードですか、悪いコードですか?
現代のC++文字列にポインタを使用することをお勧めしますか?このよう :テスト変数でC++の最新の文字列ポインタ
std::string *test = new string();
anyfunction(test);
は非常に長いテキストです。だから私は、ポインタを使って行動する方が簡単で速いと思っていました。
これは良いコードですか、悪いコードですか?
現代のC++では、生ポインタを使用することはお勧めしません。代わりに、スマートポインタを使用することができます。 C++ 11- :: auto_ptr、std :: unique_ptr、 std :: shared_ptr、およびstd :: weak_ptrの4つのスマートポインタがあります。 すべては、動的に割り当てられたオブジェクトのライフタイムを管理するのを助けるために設計されています。つまり、例外が発生した場合には を含む適切なタイミングで適切な方法でオブジェクトが破棄されるようにします。一般的に
auto_ptrは推奨されていません。この場合、最良のアドバイスはポインタをまったく使用しないことです –
[std :: auto_ptr] /en.cppreference.com/w/cpp/memory/auto_ptr)はC++ 11以降では廃止され、C++では存在しません。 –
std :: auto_ptrの代わりに何が使えますか?私はそれが非難されたと聞いたので – Hball
これは本当に悪い考えです - 二つの理由:
二の理由:あなたはスマートポインタでそれをラップせずに手動ヒープ割り当てを使用しています。しかし、 std::unique_ptr
は症状にバンドエイドを入れるだけです。
主な理由:あなたは正しい方向に考えています(データの大きなジャンクの不要なコピーを避ける)が、間違ったツールを使用しています。関数のパラメータの型は正しいツールです。
この関数は文字列を読み取るだけでよいですか?その署名は次のようになります。
return_type anyfunction(const std::string& test);
constを渡すことで、文字列がコピーされません。あなたが書き込みアクセスを同様に必要な場合は、const
を省略:
return_type anyfunction(std::string& test);
ここでも、コピーは行われません。文字列を関数に移動することもオプションになります。しかし、それ以上の文脈なしで言うことは難しいです。
std :: stringは基本的にヒープ上に作成されます。いくつかの最適化バージョンは、速度のためにスタック上に短い文字列を作成しますが、それはここで問題ではありません。
オブジェクトをスコープから外すと自動的に破棄することはできないため、newを使用してオブジェクトを作成することはお勧めできません。 (時にはこの動作が必要な場合もありますが、それはまれです。実際にはC++プログラマの初心者にとっては新しいものとはみなされません)。スタックの使用にはほとんど影響しません。なぜなら、ほんの些細な制御変数しかスタックには載っていないからです。
初期化の仕方は表示されていません。または、どのようにデータを使用するのか。 const std :: stringを渡す一方で、ポインタを渡すための代替の表記法は実際にはちょうど代替表記です。もっと慣れています。しかし現代のC++は文字列ビューに移行しています。基本的には文字列を作成し、次にデータにビューを作成します。文字列が非常に長い場合は、これが重要になる可能性があります。たとえば、長い文字列の短い部分文字列の検索は、長い文字列が太い配列の場合は非常に時間がかかりますが、接尾辞ツリーの場合はかなり高速です。
文字列のビューはまだ実験です:ポインタを使用して http://en.cppreference.com/w/cpp/experimental/basic_string_view
は、間接の別のレベルを意味します。C++ 11は移動セマンティクスを持っているので、深いコピーをせずに文字列のコピーを簡単に移動することができ、new
文字列またはその他のC++オブジェクトの必要性がほとんどなくなります。
C++は参照を優先します。たとえば 'std :: string test; void anyfunction(const std :: string & s); anyfunction(test) '。 – UmNyobe
***現代のC++文字列にポインタを使用することを推奨しますか?***それは今まで行っていません。 'コードを書いたことがありましたが、私は一度もそれをしていません。 – drescherjm