今天编译我的程序时,我注意到 GCC 的内存消耗模式(编译步骤)中有一些非常奇怪的东西(我确信可以以某种方式解释)。名为“cc1plus”的进程使用大约 10 GB 的 RAM 来运行一个少于 10 000 行代码的程序。在注释和取消注释代码行之后,我终于找到了“罪魁祸首”:
std::bitset<UINT_MAX>
如果您想测试自己,请尝试这个非常简短的程序:
#include <iostream>
#include <bitset>
#include <climits>
std::bitset<UINT_MAX> justAVar;
int main()
{
std::cout << UINT_MAX << std::endl;
return 0;
}
使用-std=c++11或-std=c++0x编译它,请注意,即使是这个小例子在编译时 也会使用大量 RAM (在我的情况下,gcc 的两个盒子都是 7 GB,clang 是 2.6 ) 因此,如果您必须按下重置按钮,请不要像没有被警告过一样抱怨和诅咒众神。
我的测试机器:
设置 1:Debian 7.0 64,gcc 4.8.1
设置2:Ubuntu 12.04 64,gcc 4.7.3,gcc 4.8.1,clang 3.0.6(最后一个使用-std=c++0x)
正如我的一位好心同事向我展示的那样,关于 bitset 构造函数的实现的一个提示(显然,由 C++11 和 C++0x 的 if def 保护):它是使用constexpr声明的
现在的问题是:有人可以向我(我们)解释一下在这种情况下所有这些编译器发生了什么吗?
谢谢