Template_17_metaprogram
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的更多相关文章
随机推荐
- Laravel 5.0 之命令及处理程序
本文译自 Matt Stauffer 的 系列文章 . 本文中涉及的新功能都是关于 Commands 的,这些特性在 Laravel 旧版本中已经有了,但是在 Laravel 5.0 中变得更加好用了 ...
- LINUX ping 指定网卡
计算机上有多块网卡(例如笔记本电脑的无线网卡和以太网卡)连接至网络,使用ping命令想指定使用哪块网卡怎么办? ping -I eth0 10.10.10.1ping -I eth1 10.10.10 ...
- 浏览器自动化工具-Selenium
Table of Contents 1. 什么是Selenium 2. 简单的例子 3. PS 什么是Selenium Selenium可以自动化操作浏览器,利用Selenium可以模拟用户操作,因此 ...
- ES6新特性以及一些规范
1.let:使变量成为块级变量,类似于C++,java类的变量 b = 2 if (b == 2) { let c = 2; } console.log(c) // 报错,因为c是一个块级变量,只存在 ...
- A - 敌兵布阵
Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些 ...
- 7. Android框架和工具之 android-percent-support-lib-sample(百分比支持)
1. android-percent-support-lib-sample介绍: 谷歌最新的百分比布局库的示例项目.其实LinearLayout的layout_weight也能实现百分比效果,不过这个 ...
- ASP.NET调用word出错
检索COM 类工厂中CLSID 为{000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005. 开始——控制面板——管理工具—— ...
- NDK编译FFMpeg[Linux]
最近在研究视频直播相关的技术,了解到了FFmpeg,就在网上查看如何将FFmpeg移植到Android中,查了几天,看的东西不少,就是没有一个可以完全移植成功的,最后通过产看各种资料,结合网上的资料, ...
- 怒刷DP之 HDU 1160
FatMouse's Speed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Su ...
- php用curl获取远端网页内容
<?php $url="http://www.baidu.com";$cc=curl_init(); curl_setopt($cc,CURLOPT_URL,$url); c ...