これまでの答えは、問題の完全な大きさを説明していません。
Sharptoothが指摘しているように、ペアソリューションは値をゼロに初期化します。Lemurikが指摘したように、ペアソリューションは、メモリの連続ブロックを初期化するだけでなく、テーブル内のすべての要素に対してペアコンストラクターを呼び出します。ただし、それでも1.5秒かかることは考慮されていません。他に何かが起こっています。
これが私の論理です:
あなたが古代のマシンを使っていたと仮定すると、たとえば1.33GHzで実行しているとすると、1.5秒は2e9クロックサイクルになります。構築する2e6ペアがあるので、どういうわけか、各ペアコンストラクターは1000サイクルかかります。2つの整数をゼロに設定するコンストラクターを呼び出すのに1000サイクルはかかりません。キャッシュミスがどのようにそれを長くかかるかはわかりません。100サイクル未満なら信じられます。
これらすべてのCPUサイクルが他にどこに向かっているのかを見るのは興味深いと思いました。必要な無駄のレベルを達成できるかどうかを確認するために、見つけた中で最も古いC++コンパイラを使用しました。そのコンパイラはVC++v6でした。デバッグモードでは、私が理解できないことをします。これには、テーブル内の各アイテムのペアコンストラクターを呼び出す大きなループがあります-十分に公平です。そのコンストラクターは、2つの値をゼロに設定します-十分に公平です。ただし、その直前に、68バイト領域のすべてのバイトが0xccに設定されます。その地域は、大きなテーブルが始まる直前です。次に、その領域の最後の要素を0x28F61200で上書きします。ペアコンストラクターを呼び出すたびに、これが繰り返されます。おそらく、これはコンパイラによるある種の簿記であるため、実行時にポインタエラーをチェックするときにどの領域が初期化されているかがわかります。私'
とにかく、それは余分な時間がどこに行くのかを説明するでしょう。明らかに、別のコンパイラはこれほど悪くないかもしれません。そして確かに、最適化されたリリースビルドはそうではありません。