[置顶] template实例化导致代码膨胀的后果(编译器编译才20行的代码就死掉哦)

首先,说明一个我电脑的配置如下:
操作系统:    MAC OS Lion 10.7.3(64 bit)
CPU:         Intel I5
内存:        三星DDR3 1333 4G
编译器:      XCode 4.3.2 (64 bit)
              [置顶] template实例化导致代码膨胀的后果(编译器编译才20行的代码就死掉哦)_第1张图片
 
代码如下:

 

#include<iostream>
//author:[email protected]
//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的时候,自己试试就知道了。

 

        如果您要转载请标明出处,谢谢。

你可能感兴趣的:(struct,测试,xcode,OS,三星,编译器)