首先,说明一个我电脑的配置如下:
操作系统: MAC OS Lion 10.7.3(64 bit)
CPU: Intel I5
内存: 三星DDR3 1333 4G
编译器: XCode 4.3.2 (64 bit)
代码如下:
#include<iostream>
//author:1025679612@qq.com
//csdn:wind_2008_06_29
#include<typeinfo>
usingnamespacestd;
template<
typename FirstType,typename SecondType,
typename ThirdType,typename FourthType
>
struct Doublify{
//empty !
};
template<int N>
struct Trouble {
typedefDoublify<
typenameTrouble<N-1>::LongType,
typenameTrouble<N-1>::LongType,
typenameTrouble<N-1>::LongType,
typenameTrouble<N-1>::LongType
> LongType;
};
template<>
struct Trouble<0>
{
typedefdouble LongType;
};
int main(){
Trouble<900>::LongType value;
cout<<typeid(value).name()<<endl;
}
我大便回来的时候编译器的编译进度如上所示,一直没有动(我点编译的时候也是那里面,回来也是那里).哈哈我的编译器总算被我搞得无语了.
原因解释:
有人可能认为编译器编译得如此慢的原因是不断地实例化Trouble,其实不是的,Trouble最多实例化900次,但是,编译器为什么慢呢,原因是编译器把时间全部拿来写实例化之后的模板的名字,那些名字可是上亿个字符的哦(哈哈,希望没有吓到你哦,你在我代码里面看到只有几个字符,但是,编译器的名字发编会修改名称的哦).编译器光读写这几亿个字符的时间就可想而知了.我把那个实例化常数改为10,编译器都编译了5S,并且可以看到编译器给Value的名子是:
8DoublifyIS_IS_IS_IS_IS_IS_IS_IS_IS_IddddES0_S0_S0_ES1_S1_S1_ES2_S2_S2_ES3_S3_S3_ES4_S4_S4_ES5_S5_S5_ES6_S6_S6_ES7_S7_S7_ES8_S8_S8_E
希望这个名字没有吓到你,你再想想,当取数字是900的时候,编译时候是多少呢?肯定是我见马克思的那天了(要注意这里的时间是指数增长关系哦).符号长度呢?估计也是几亿个字符,哈哈.
如果您想在VS上面测试,我建议把900改小点,改成20看看,900太大了,VS是32位的,内存空间不够,编译的时候肯定会直接出错,你改成20的时候,自己试试就知道了。
如果您要转载请标明出处,谢谢。