美文网首页
C++11 模板元编程 - 不可变性

C++11 模板元编程 - 不可变性

作者: MagicBowen | 来源:发表于2016-09-16 08:15 被阅读435次

C++中可以参与编译期计算的主要是类型和编译期常量,它们都是不可变的(immutable)。从这个角度来说,C++模板元编程是一种纯函数式语言,遵循引用透明性。也就是说函数没有状态,具有不可变性。对一个函数任何时候输入相同的入参,它将永远返回相同的值。另外,这里也没有真正的变量。模板元编程里所谓变量只是一个类型的别名符号,第一次绑定后就不能再变。如果想要保存一个变化后的值,只能重新定义一个新的变量。

例如下面代码就无法编译通过:

using Sum = __int(0);  // ok
Sum = __add(Sum, __int(6)); // error

只能像下面这样:

using Int0 = __int(0);  // ok
using Sum = __add(Int0, __int(6)); // ok

这种不可变性带来很多好处。例如由于函数没有状态,所以可以保存入参然后延迟计算,这使得语言层面的惰性计算变得容易。

但这种不可变性也带来很多问题,它会占用更多的内存和运行时开销。纯函数式语言一般依赖编译器或者解释器对其进行优化,但是性能普遍还是没有命令式的好。这也是为什么大量地使用模板会使得C++的编译速度超出寻常地慢,而且会占用更多的内存。


惰性

返回 C++11模板元编程 - 目录

相关文章

  • C++11 模板元编程 - 不可变性

    C++中可以参与编译期计算的主要是类型和编译期常量,它们都是不可变的(immutable)。从这个角度来说,C++...

  • C++11 模板元编程 - 元编程

    从本节开始我们将模板元编程当做一门独立的函数式语言来讨论它的方方面面。 所谓元编程,就是指可以产生程序的程序。由于...

  • C++11 模板元编程 - 模板元编程的应用

    本节开始我们通过使用C++模板元编程去解决一些实际问题,来展示模板元编程针对现实问题的使用方法和设计技巧。本节中的...

  • C++11 模板元编程 - 模板递归

    模板可以被递归调用,在模板递归的过程中,可以执行前面我们提到的两种编译期计算:数值计算和类型计算。 下面我们用模板...

  • C++11 模板元编程 - 元函数

    我们继续演进前面那个无聊的类型计算的例子,来得出元函数的定义。 前面我们实现了PointerOf,它对于传进的任意...

  • C++11 模板元编程 - 后记

    当1994年,Erwin Unruh在C++标准委员会上演示了通过C++模板在编译期计算素数的程序后,C++模板元...

  • C++11 模板元编程 - 前言

    熟悉C++的程序员都知道,C++是一门多范式编程语言,支持面向过程、面向对象、泛型编程以及函数式编程范式。然而提到...

  • C++11 模板元编程 - 目录

    前言 模板的基础知识模板的类型参数模板的默认参数模板的模板参数模板的特化模板的非类型参数模板的编译期计算数值计算类...

  • C++11 模板元编程 - 递归

    函数式语言依赖模式匹配和递归完成类似命令式语言里分支选择和循环迭代的功能。模板元编程中可以完成模式匹配的两种方式上...

  • C++11 模板元编程 - 惰性

    C++对模板的具现化采用尽量惰性的原则。只有当你使用了模板的内部定义,编译器才会为模板生成对应的定义。 所以对于元...

网友评论

      本文标题:C++11 模板元编程 - 不可变性

      本文链接:https://www.haomeiwen.com/subject/chgbettx.html