1,
模板实例化机制是一种基本的递归语言机制,可以用于在编译期执行复杂计算。


2,枚举值和静态常量
在原来的C++编译器中,在类声明的内部,枚举值是声明"真常值"(常量表达式)的唯一方法。
然而现在C++的标准化过程引入了在类内部对静态常量初始化的概念。

该版本存在一个缺点:静态成员变量只能是左值。因此如果具有如下一个声明:
void foo(int const&);
传入静态成员版foo(Pow3<7>::result);那么编译器将必须传递Pow3<7>::result的地址,而这会强制编译器实例化静态成员的定义,并为改定义分配内存。于是计算将不在局限于"编译期"的效果。
然而枚举值却不是左值(也就是说它没有地址)。因此当引用传递枚举值的时候,并不使用静态任何内存,就像文字常量的形式传递。
基于这些考虑使用枚举好些。

3,计算平方根


使用运算符 ?: 时,编译器不仅实例化运算符真分支的模板,同时也实例化负分支模板。
而且代码试图使用::运算符访问结果类的成员result,所以类中所有成员同时都会被实例化,
最终会产生数量庞大的实例化,总数大约的N的两倍。从而消耗大量内存。



使用IfThenElse模板能根据bool常量的值,在两个类型中选择其中一个。
为一个模板实例定义typedef并不会导致C++编译器实例化该实例的实体。
SubT只代表其中的一个类型。而且只有在查找SubT::result的时候,才会完全去实例化SubT所代表的类型。
使实例化数量趋近与log2(N)

4,使用归纳变量

上面并没有提供结束递归的局部特化,而是使用一个Value<>模板,它会返回模板实参的值作为所求的result。
使用IfThenElse<>后,实例化的数目会趋近与sqrt(N)。

5,
C++标准建议最多进行17层递归实例化。

6,使用元编程来展开循环

int result = 0;
for(int i< 0 ; i < Dim; i++)
{
result += a[i] * b[i];
}
对于许多迭代,编译器通常会优化这种循环,
上面循环可简单扩展为a[0]*b[0]+a[1]*b[1]+a[2]*b[2]…
如果需要执行上千万次点乘音响就会很大。


通常一些metaprogram的性能要比优化器的性能更好,因为metaprogram往往可以再计算过程中结合高层的知识。

7,计算素数



对于模板D而言,只存在一个正对void*的构造函数,所以吧1(int)赋值给D的时候会出错,而0却存在void*的转型所以可以顺利赋值给d.

Template_17_metaprogram的更多相关文章

随机推荐

  1. boost.asio源码剖析(五) ---- 泛型与面向对象的完美结合

    有人说C++是带类的C:有人说C++是面向对象编程语言:有人说C++是面向过程与面向对象结合的语言.类似的评论网上有很多,虽然正确,却片面,是断章取义之言. C++是实践的产物,C++并没有为了成为某 ...

  2. HTML+CSS+JS基础知识

    HTML+CSS+JS基础知识 目录 对HTML+CSS+JS的理解 基础知识 对HTML+CSS+JS的理解 基础知识 插入样式表的三种方式 外部样式表:<link rel="sty ...

  3. Cocos2d-x 程序是如何开始运行与结束的

    题记:对于技术,我们大可不必挖得那么深,但一定要具备可以挖得很深的能力   问题的由来   怎么样使用 Cocos2d-x 快速开发游戏,方法很简单,你可以看看其自带的例程,或者从网上搜索教程,运行起 ...

  4. 文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别

    这两天在调优数据库性能的过程中需要降低操作系统文件Cache对数据库性能的影响,故调研了一些降低文件系统缓存大小的方法,其中一种是通过修改/proc/sys/vm/dirty_background_r ...

  5. C++面试题:list和vector有什么区别?

    原文:http://genwoxuevc.blog.51cto.com/1852984/503337 C++面试题:list和vector有什么区别?考点:理解list和vector的区别出现频率:★ ...

  6. PHP经验——PHPDoc PHP注释的标准文档(翻译自Wiki)

    文档注释,无非“//”和“/**/”两种 ,自己写代码,就那么点,适当写几句就好了:但是一个人总有融入团队的一天,团队的交流不是那几句注释和一张嘴能解决的,还需要通用的注释标准. PHPDoc是PHP ...

  7. 算法总结—深度优先搜索DFS

    深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake C ...

  8. PHP常用文件函数和目录函数整理

    一.常用文件函数库 1.basename(); -- 返回路径中的文件名部分. string basename ( string $path [, string $suffix ] ) //给出一个包 ...

  9. extjs中grid对于其中表单的表头的读取以及是否隐藏的判断

    //获取grid的表头信息 var columns=baseGrid.columns;                     alert(columns.length); //判断列是否隐藏并输出表 ...

  10. Vmware出现报错The VMware Authorization Service is not running.之后无法上网解决

    今天一大早开VMware,启动ubuntu时出现了报错The VMware Authorization Service is not running,服务Authorization没有运行. 这之前一 ...