写了一个编译期执行的fibonacci模板:
template fibonacci(long n){
static if(n <= 2)
const long fibonacci = 1;
else
const long fibonacci = fibonacci!(n-1) + fibonacci!(n-2);
}
static long a = fibonacci!(40);
D语言新支持的编译期执行函数也可以完成:
long fibonacci(long n){
if (n <= 2) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
static long a = fibonacci(40);
这2种实现,我原想编译效率应该都比较低,因为编译期执行是要花编译时间的。结果前一种编译效率非常高,后一种则比较低。仔细想想,的确应该是这样,这与模板产生代码的机制有关。
模板在实例化时,会根据参数产生出不同的代码。比如上面的第一个例子,fibonacci!(1)和fibonacci!(2)就会实例化出2份代码,所以fibonacci!(40)相当于产生了这样一组代码:
// ....
const long fibonacci_38 = fibonacci_37 + fibonacci_36;
const long fibonacci_39 = fibonacci_38 + fibonacci_37;
const long fibonacci_40 = fibonacci_39 + fibonacci_38;
static long a = fibonacci_40;
把每一个值都给缓存下来了,效率当然高了,我们使用相同的缓存策略也可以缩短函数的运行时间。
编译期执行的函数则没有这个优点,它和普通的函数没有区别,不同点在于它在编译的时候运行。把编译器看成一种动态语言运行环境,那么编译“编译期执行的函数”的过程就像是运行动态语言程序的过程。如果程序中存在大量编译期执行函数,可能极大地降低编译效率,对于它的使用应该尽量避免。
模板提供的是一种声明式语法,在复杂的静态执行逻辑面前有时候会显得力不从心,编译期执行函数在解决这个问题的同时,却带来了上面这种副作用。如果能把两者的优点结合起来,用函数的语法来写程序,由编译器生成优化的模板代码,这种编译期执行才可以大量使用。
分享到:
相关推荐
constexpr函数则可以在编译期计算常量表达式,从而提高代码的执行效率。 在模板元编程中,可以使用模板参数和typedef名字来实现编译期计算。例如,以下代码实现了一个简单的If-Else语句: ```cpp template , ...
至于编译期的打印操作,C++标准库并没有提供编译期的打印功能,因为这是运行时的行为。然而,通过模板元编程和类型安全的打印工具,如`std::cout`,我们可以构建一种方法来在编译期间生成输出代码,然后在运行时执行...
**APT技术在编译期生成代码** Android平台中的APT(Annotation Processing Tool)技术是一种强大的工具,它允许开发者在编译期间通过注解处理器自动产生源代码或者资源文件。这一技术在提升开发效率、减少运行时...
总结起来,这个开源项目利用ASM库在编译期实现对任意方法的Systrace打点注入,大大简化了性能监控的设置过程,提高了开发者的工作效率。对于想要深入了解Android性能优化和字节码操作的开发者来说,这是一个宝贵的...
编译期注解与运行期注解的主要区别在于,运行期注解需要在程序运行时通过反射等方式来解析和执行,而编译期注解则在编译期间就被处理,生成相应的字节码或辅助类,从而避免了运行时的性能损耗。 一、编译期注解的...
在C++编程中,模板(Template)是一种强大的元编程工具,允许我们在编译时进行泛型编程,实现代码复用并提升效率。标题中的"TmplArgs"可能是一个库或者一个概念,它利用模板技术来分析函数参数,以获取更多的信息并...
在C++编程中,编译时键值映射是一种能够在编译阶段进行数据映射的技术,这极大地提高了程序的效率和安全性。C++17引入了一些新的特性,使得实现不可变的编译时键值映射变得更加便捷。下面将详细讨论这个主题。 首先...
### VC++6.0编译器编译期存储器分配模型(内存布局) #### 关于本文 编程过程中,我们常常会遇到程序崩溃的情况,而究其根本,很多时候问题的源头都在于对内存管理的理解不够深入。本文将详细介绍VC++6.0编译器在...
本文将深入探讨如何在Android项目中利用APT技术在编译期生成代码,并通过一个简单的View注入项目ViewFinder来阐述其实现过程。 首先,了解什么是APT。APT是Java编译器的一部分,它能够扫描源代码中的注解,并在编译...
本作业"作业长整数加法.zip"关注的是如何利用C++元编程来实现编译时的长整数加法,特别是针对编译期数组的操作。以下将详细阐述涉及的知识点: 1. **C++元编程基础**: - 元编程分为运行时元编程和编译时元编程。...
但是,JIT编译器还可以使用锁cache机制来提高编译后的执行效率。 锁cache机制允许JVM将编译方法的本地代码锁在cache中,以提高编译执行时的指令cache命中率。通过分析Java虚拟机中的编译方法调用规律,可以得到编译...
在编译器实例化模板时,实际上执行了一个编译期的递归过程,最终生成的机器码中直接包含了计算结果。 类型选择的例子`IfThenElse`展示了如何根据编译时常量表达式的真假来选择返回的类型。这利用了模板特化来实现...
在C++中,模板元编程可以用于创建复杂的编译期数据结构和算法,如静态数组、编译期计算斐波那契数列、类型选择等。例如,Fibonacci数列的模板元编程实现,通过递归模板实例化计算出特定位置的斐波那契数,这在编译...
- **代码优化**:改进中间代码,提高目标代码的执行效率。 - **表格处理**:生成并管理符号表等辅助数据结构。 - **出错处理**:检测并报告源代码中的错误。 2. **编译程序与解释程序的区别**: 编译程序一次性...
静态代码是指在编译期执行的代码,动态代码是指在运行期执行的代码。C++模板元编程的核心机制是模板,模板可以在编译期生成代码,并提供了类型计算、代码计算等功能。 C++模板元编程的类型计算是指在编译期计算类型...
JavaScript的运行机制主要涉及到代码块、函数声明与赋值、预编译期和执行期等核心概念。首先,我们从代码块开始。 1. **代码块**:在JavaScript中,代码块通常指的是由`<script>`标签包裹的代码段。每个`<script>`...
编译器的优化技术是指编译器在将高级语言转换为机器代码时所采取的一些优化措施,以提高代码的执行效率。这些优化技术包括: 1. Dead Code Elimination:该技术可以删除未使用的代码,以减少代码的体积和提高执行...
此外,如果数据集基本不变,ArrayList的初始分配和内存管理可能会稍微快一些,因为它不需要处理泛型相关的编译期检查。 总的来说,选择ArrayList还是List主要取决于项目需求。如果你追求性能和类型安全,推荐使用...