Ответы до сих пор не объясняют всю масштабность проблемы.
Как указал sharptooth, решение для пары инициализирует значения до нуля. Как указал Лемурик, парное решение не просто инициализирует непрерывный блок памяти, но и вызывает конструктор пар для каждого элемента в таблице. Однако даже это не означает, что это займет 1,5 секунды. Что-то еще происходит.
Вот моя логика:
Если предположить, что вы работали на древней машине, скажем, на частоте 1,33 ГГц, тогда 1,5 секунды - это 2e9 тактов. У вас есть 2e6 пар для построения, так что каждый конструктор пары требует 1000 циклов. Для вызова конструктора, который просто устанавливает два целых числа в ноль, не требуется 1000 циклов. Я не могу понять, как из-за отсутствия кэша это заняло бы столько времени. Я бы поверил, если бы число было меньше 100 циклов.
Я подумал, что было бы интересно посмотреть, куда еще идут все эти циклы ЦП. Я использовал самый дрянной самый старый компилятор C ++, который я смог найти, чтобы увидеть, смогу ли я достичь требуемого уровня потерь. Этот компилятор был VC ++ v6. В режиме отладки он делает что-то, чего я не понимаю. У него есть большой цикл, который вызывает конструктор пар для каждого элемента в таблице - достаточно справедливо. Этот конструктор устанавливает два значения в ноль - достаточно справедливо. Но непосредственно перед этим он устанавливает все байты в области 68 байтов равными 0xcc. Этот регион как раз перед началом большого стола. Затем он перезаписывает последний элемент этого региона с 0x28F61200. Каждый вызов конструктора пар повторяет это. Предположительно это какая-то бухгалтерия компилятора, поэтому он знает, какие области инициализируются при проверке ошибок указателя во время выполнения. Я хотел бы знать точно, для чего это.
В любом случае, это объяснило бы, куда уходит дополнительное время. Очевидно, что другой компилятор не может быть так плохо. И, конечно же, оптимизированной сборки релиза не будет.