到目前为止的答案并不能解释问题的全部严重性。
正如尖牙指出的那样,对解决方案将值初始化为零。正如 Lemurik 指出的那样,pair 解决方案不仅仅是初始化一个连续的内存块,而是为表中的每个元素调用 pair 构造函数。但是,即使这样也不能说明它需要 1.5 秒。其他事情正在发生。
这是我的逻辑:
假设您在一台古老的机器上运行,假设以 1.33ghz 运行,那么 1.5 秒就是 2e9 个时钟周期。你有 2e6 对要构造,所以不知何故,每个对构造函数都需要 1000 个周期。调用仅将两个整数设置为零的构造函数不需要 1000 个周期。我看不出缓存未命中如何使其花费那么长时间。如果这个数字少于 100 个周期,我会相信它。
我认为看看所有这些 CPU 周期的其他地方会很有趣。我使用了我能找到的最糟糕的最古老的 C++ 编译器,看看我是否能达到所需的浪费水平。该编译器是 VC++ v6。在调试模式下,它会做一些我不明白的事情。它有一个大循环,为表中的每个项目调用 pair 构造函数——这很公平。该构造函数将这两个值设置为零 - 足够公平。但在此之前,它将 68 字节区域中的所有字节设置为 0xcc。该区域就在大桌子开始之前。然后它用 0x28F61200 覆盖该区域的最后一个元素。对构造函数的每次调用都会重复此操作。大概这是编译器的某种簿记,因此它知道在运行时检查指针错误时初始化了哪些区域。一世'
无论如何,这将解释额外时间的去向。显然另一个编译器可能没有这么糟糕。当然,优化的发布版本也不会。