質問

私は非常に簡単な質問をしていますが、残念ながら自分で答えを理解することはできません。

設定を保持し、設定マップのように機能するデータ構造があるとします。私は持っています GetValue(const std::string& name) メソッド、対応する値を返します。

今、私は把握しようとしています - どのようなreturn -valueアプローチがより良いでしょう。明らかなことは、私の方法をように振る舞わせることを意味します

std::string GetValue(const std::string& name) const

オブジェクトのコピーを返却し、パフォーマンスの意味でRVOに依存します。

もう1つは、2つの方法を作成することを意味します

std::string& GetValue(...)
const std::string& GetValue(...) const

これは通常、コードを複製するか、いくつかの邪悪な定数キャストを使用してこれらのルーチンのいずれかを2回使用することを意味します。

#Q

この種の状況であなたの選択は何ですか、そしてその理由は何ですか?

役に立ちましたか?

解決

実際、私はおそらく使用するでしょう:

std::string GetValue(const std::string& name) const;
// or
const std::string* GetValue(const std::string& name) const;

void SetValue(std::string name, std::string value);

最初にセッター:

  • で値を通過します SetValue コンパイラは、const-referenceでパスで行うことができない最適化を許可します。それは、Dave Abrahamsの記事で説明されています。 「スピードが欲しい?価値を通過します。」
  • を使って Setter 通常、設定されている値を確認できるため、より良いですが、明白な参照を使用すると、発信者がデータで愚かなことをしないという保証はありません。

ゲッターのために:

  • ほとんどの場合、オブジェクトが返されない場合(設定マップの場合)、ほとんどの場合、コピーで戻ることは無駄のようですが、ポインターまたは参照は、エイリアスされたオブジェクトが十分に長く生きていることを意味します。 MOOT:値で返します。また、たとえばあなたが突然に切り替えることになった場合、内部の詳細が公開されないようにコピーすることもできます std::wstring UTF-8にいくつかの設定が必要だから...
  • パフォーマンスが必要な場合は、この部門でいくつかの譲歩をする準備ができています。ただし、参照では、ポインターが簡単にする一方で(魔法の価値がない限り)、プロパティの不在を信号することはできません(nullは既にカットされています)。

他のヒント

それは使用法によって異なります。したほうがいい GetValue("foo") = "bar" わかる?その場合、価値で戻ることはあなたが望むことをしません。

const Referenceで戻ることができる場合は、してください。値によるstd :: stringのようなメモリ管理クラスを返す唯一の理由は、それが一時的な文字列であるためです。

これは、C ++の非常に「敏感な」ポイントです。 IMHOこれは、C ++デザインの最も弱いポイントの1つです。 AFAIK本当に良い選択はありません。それは見た目もパフォーマンスもあります。

通常、RVOの最適化はジョブの一部しかないことを述べるべき1つのポイントです。それがなければ、このような典型的な表現:

std::string txt = GetValue("...");

実際に2コピーを生成します!コンパイラに依存しますが、通常、RVO最適化は1つのコピーのみを排除しますが、もう1つはまだそこにあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top