C++のコンストラクタ
const string&を引数にとるコンストラクタがあるとき、、機械的にcosnt char *を引数にとるコンストラクタを作ると良い。例えば下のようなクラスがあるとき
class Message { string msg; public: Message(const string& msg_) : msg(msg_) {} }
次のようにした方が速いことがある
class Message { string msg; public: Message(const string& msg_) : msg(msg_) {} Message(const char *msg_) : msg(msg_) {} }
これが速くなるのは下のように初期化したときだ。
Message msg("Hello");
stringの生成される回数が1回少くなる。const char *を取らない場合は"Hello"はstring(const char *)というコンストラクタでstring型に変換され、再度msg(msg_)でstringが生成されるのに対して、const char *があるとmsgの構築のみで終わる。
生成と破棄を繰り返してベンチマーク取った。ベンチマークを取ったコードの一部はこんな感じ
for (i=0; i<COUNT; i++) { Message msg("Sample Message"); }
ループ回数 | const char *を引数に取らないとき | const char *を引数に取るとき |
1,000,000回 | 0.75sec | 0.49sec |
5,000,000回 | 3.66sec | 2.42sec |
10,000,000回 | 7.29sec | 4.83sec |
C++を使うときはいろんな暗黙の動作を知ってないといけないなぁ。