レスくださった方々ありがとうございます。

>std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く
>compare(const string& str) とする理由は引数に参照を取る事となり
>コピーが働かないので無駄なメモリの消費がなくなる。

なるほど!勉強になります。

あと、compareの宣言ですが、stringやcstringの中も見てみたのですが、みつからないんです。