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++を使うときはいろんな暗黙の動作を知ってないといけないなぁ。