美文网首页
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 模板元编程 - 不可变性

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