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

原创 2012年07月03日 09:59:42
首先,说明一个我电脑的配置如下:
操作系统:    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的时候,自己试试就知道了。

 

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

matlab膨胀和腐蚀的案例详解

【转载】:http://www.cnblogs.com/tornadomeet/archive/2012/03/20/2408086.html Matlab 形态学图像处理(原文作者很是细心,感...
  • zhengalen
  • zhengalen
  • 2016年05月18日 19:53
  • 2479

膨胀和腐蚀在MATLAB中

腐蚀和膨胀操作更细致的分析(主要谈论涉及图像边缘的腐蚀和膨胀运算)。 注:结构元素在扫描图像中的每个像素时,结构元素的邻域有部分会在图像外面。比如当结构元素扫描图像上方第一行像素值(这里默认结构元素...
  • zhengalen
  • zhengalen
  • 2016年05月18日 19:52
  • 2176

二值图像膨胀腐蚀算法的几种实现方式

膨胀与腐蚀算法   对图像处理有所了解的人都知道图像的形态学处理里最为基础的膨胀和腐蚀算法。二值图像即只有黑白两种颜色组成的图像,一般的白色为内容,黑色为背景。其实简单点理解二值图像的膨胀与腐蚀...
  • wozhengtao
  • wozhengtao
  • 2016年05月17日 01:17
  • 6397

第四章示例代码__对象的实例化方式

  • 2013年03月01日 13:51
  • 1.62MB
  • 下载

实例化代码

  • 2012年11月11日 00:04
  • 15KB
  • 下载

用代码创建并实例化在storyboard中声明的ViewController

http://kyfxbl.iteye.com/blog/1997502 我们的项目最早是基于storyboard开发的,所以一开始所有的ViewController都通过storybo...
  • fevershen
  • fevershen
  • 2016年05月31日 15:09
  • 1027

知道你的代码哪里出了问题吗?——由控件实例化引发的运行崩溃

写在前面的话:        本人学习Android一年有余,自我评估对于Activity的基础知识运用还是比较到位,但就是最近开发项目时,竟被一个问题折磨了整整一天,反复调试发现时好时坏,一度怀疑...
  • huangyh000000
  • huangyh000000
  • 2016年06月15日 15:31
  • 304

WSDL文件复杂类型的解析及其实例化代码生成

1.设计要求根据WebService的地址,对其WSDL文件进行解析,重点解析其中包含的复杂类型。针对解析出的复杂类型的结构,生成对应的类实例化代码。2.WSDL解析过程WSDL的解析过程就是对WSD...
  • zhangzhuoyang
  • zhangzhuoyang
  • 2016年07月13日 15:25
  • 1505

java对象实例化过程中的代码执行顺序

java对象实例化过程中的代码执行顺序1、执行顺序(1)执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容; (2)子类的静态内容执行完毕之后,初始化父类的成员变量--->执行父...
  • hxuhongming
  • hxuhongming
  • 2017年08月10日 08:53
  • 147

使用不同数据类型实例化Stack泛型类的代码

package 泛型; import java.math.BigDecimal; import java.math.MathContext; public class StackDemoApp {...
  • u012110719
  • u012110719
  • 2014年11月25日 20:53
  • 592
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:template实例化导致代码膨胀的后果(编译器编译才20行的代码就死掉哦)
举报原因:
原因补充:

(最多只允许输入30个字)