由模板元编程看 VC 和 GCC 编译方式的不同

       前作《从 C++ 模板元编程生产质数看 F# 函数式编程思想》一文中模板元编程代码,原文提出,在 VS 2010 平台下只递归到离 LAST 最近的一个质数便终止了向更深层的递归过程。这个问题我一直觉得奇怪,让我们这里重点看一下递归处的代码:

template < int n > struct PrimePrint { enum { Prime = IsPrime < n, n / 2 > :: Prime }; PrimePrint < n - 1 > p; PrimePrint () { LB lb = Prime ? 1 : 0; } }; 

       由代码可知,在调用 PrimePrint<n> 的构造函数之前,应该先调用 PrimePrint<n – 1> 的构造函数才是。但是 VS 平台下的表现让人很不解,感觉好像顺序正好反了过来,先调用的 PrimePrint<n> 的构造函数,而后才调用 PrimePrint<n – 1> 的构造函数。后来,我让 LOADEN 前辈在 GCC 4.4.1 平台下做了同样的实验,报错信息如下:

由模板元编程看 VC 和 GCC 编译方式的不同_第1张图片

       注意到 GCC 4.4.1 平台下“顺利”地按着我们预想的方向从最小的质数 2 开始报错。对比 VS 2010 所报错误:

       可以看到,是“刚深入到 7”就停了下来。

       实验是在 LAST 为 10 的初始状态下开始往深处递归的。这段模板元编程代码的目的就是让编译器在质数处报错。按照调用的顺序,的确在 7 处就会出错,这一点被 VS 2010 平台“敏锐”地观察到,而 GCC 4.4.1 相比较就“老老实实”地递归到最深处的 2。我们再设想一下,如果 LAST 设为 100 呢?VS 2010 会在 97 处就停下来,因为 97 是小于 100 的最大的质数。而 GCC 4.4.1 则会“老老实实”地递归 99 层到 2……这是不是可以说,VS 2010 要比 GCC 4.4.1 聪明多了呢

你可能感兴趣的:(编程,struct,gcc,平台,编译器,2010)