2009-08-06 14 views
1

むしろ簡単な質問です。 エラー、例外、ユーザーメッセージはどこに保存する必要がありますか? これまでのところ、私はいつも呼び出される関数内のローカル文字列を宣言し、気にしませんでした。例: ユーザー、エラー、例外メッセージの格納先(C++)

SomeClass::function1(...) 
{ 
std::string str1("message1"); 
std::string str2("message2"); 
std::string str3("message3"); 
... 
// some code 
... 
} 

は突然、私は建設&初期化されてから各時間と呼ばれ、それは非常に高価であるかもしれないことに気づきました。クラス内の静的な文字列として、または個別のモジュール内に格納する方が良いでしょうか? ローカリゼーションはここでは該当しません。

ありがとうございます。

答えて

5

文字列定数を使用するのはなぜですか?

SomeClass::function1(...) 
{ 
/* ... */ 
    throw std::runtime_error("The foo blortched the baz!"); 
/* ... */ 
} 

また、static const std::stringを使用することもできます。あなたが他のstd::string秒の多くにそれらをコピーすることが予想される場合に適していて、あなたのC++実装は、コピーオンライトん:

SomeClass::function1(...) 
{ 
    static const std::string str_quux("quux"); // initialized once, at program start 
    xyz.someMember = str_quux; // might not require an allocation+copy 
} 

あなたはこれらstring秒のコピーをたくさん作ることが予想される場合、そしてあなたにコピーオンライトがない(またはそれに頼ることができない)場合は、boost::flyweightを調べるとよいでしょう。

+0

ほとんどの現在の実装では、コピーオンライトは実行されません。それらが提供するメリット(パフォーマンスに応じた)は、スレッドセーフであるためにはトラブルの量によってパフォーマンスが向上します。マルチスレッド環境に対処するには、すべての操作(読み取りと書き込みの両方)を保護するためにロックを追加する必要があり、パフォーマンスが大幅に低下します。 –

+0

警告:関数のローカル統計(例のstr_quuxなど)は、プログラムの起動時には初期化されず、包含する関数の最初の実行時に初期化されます。これにより、スレッドの安全性の問題が発生します。 –

1

TBHおそらく、必要なときにのみエラーメッセージを構成するのが最良です(つまり、スローダウンが発生した場合に気になる人が間違っている場合)。メッセージが常に表示される場合は、毎回初期化されるという事実を避けるために、メッセージを静的に定義するのが最善の方法です。しかし、一般的に、私はデバッグモードでしかユーザメッセージを表示しないので、パフォーマンスビルドを実行しようとしている場合は表示しない方が簡単です。私はそれが必要なときにだけそれらを構築する。

+0

+1関数の先頭にある変数を定義することは、(正しくは、IMO)C++で悩まされています。必要なときに定義します。 (メッセージを操作するつもりがない場合は、文字列を作成するのはなぜですか?) – sbi

関連する問題