我们知道,使用宏可以实现条件编译:
#if 1
//do something
#else
//do something else
#endif
使用模板也能够达到类似的效果:
#include <stdio.h>
template <bool value>
void func()
...{
if (value)
...{
printf("true ");
}
else
...{
printf("false ");
}
}
int main()
...{
func<true>();
return 1;
}
你可能会担心,使用if来判断是否会影响性能,我们可以看看编译器生成的代码究竟是怎么样的:
GCC编译器:
; g++ -o main.s main.cpp -S
.globl __Z4funcILb1EEvv .def __Z4funcILb1EEvv; .scl 2; .type 32; .endef __Z4funcILb1EEvv: pushl %ebp movl %esp, %ebp subl $8, %esp movl $LC0, (%esp) call _printf leave ret .def _printf; .scl 2; .type 32; .endef .def __Z4funcILb1EEvv; .scl 3; .type 32; .endef |
可见GCC编译后,生成的代码里面并没有条件判断。
再使用微软的编译器试试:
; call E:\win2003_program\vs2005\VC\bin\vcvars32.bat
; cl.exe /FAs main.cpp
; Function compile flags: /Odtp ; COMDAT ??$func@$00@@YAXXZ _TEXT SEGMENT ??$func@$00@@YAXXZ PROC ; func<1>, COMDAT
; 5 : {
push ebp mov ebp, esp
; 6 : if (value)
mov eax, 1 test eax, eax je SHORT $LN2@func
; 7 : { ; 8 : printf("true\n");
push OFFSET $SG3676 call _printf add esp, 4
; 9 : } ; 10 : else
jmp SHORT $LN3@func $LN2@func:
; 11 : { ; 12 : printf("false\n");
push OFFSET $SG3678 call _printf add esp, 4 $LN3@func:
; 13 : } ; 14 : }
pop ebp ret 0 ??$func@$00@@YAXXZ ENDP ; func<1> _TEXT ENDS |
哎呀!微软的cl.exe还是加上了条件判断。我们再试试加上优化选项:
; call E:\win2003_program\vs2005\VC\bin\vcvars32.bat
; cl.exe /FAs main.cpp /O1
PUBLIC ??_C@_05LFIOBDML@true?6?$AA@ ; `string' PUBLIC ??$func@$00@@YAXXZ ; func<1> EXTRN _printf:PROC ; COMDAT ??_C@_05LFIOBDML@true?6?$AA@ ; File f:\practice\c_c++\2008-01-03\testtemplate\main.cpp CONST SEGMENT ??_C@_05LFIOBDML@true?6?$AA@ DB 'true', 0aH, 00H ; `string' ; Function compile flags: /Ogspy CONST ENDS ; COMDAT ??$func@$00@@YAXXZ _TEXT SEGMENT ??$func@$00@@YAXXZ PROC ; func<1>, COMDAT
; 6 : if (value) ; 7 : { ; 8 : printf("true\n");
push OFFSET ??_C@_05LFIOBDML@true?6?$AA@ call _printf pop ecx
; 9 : } ; 10 : else ; 11 : { ; 12 : printf("false\n"); ; 13 : } ; 14 : }
ret 0 ??$func@$00@@YAXXZ ENDP ; func<1> _TEXT ENDS |
恩,很好!加上优化选项后,没有条件判断了。
综上所述:使用模板来进行条件编译,可以更加灵活,而且效率上不会有丝毫影响。
还有一个问题就是,每次调用都要加上func<true>或者func<false>,不知道有什么办法可以设置一个默认参数。我尝试template <bool value=true>结果编译不过去,大家如果有什么好的办法请告诉我,谢谢!
分享到:
相关推荐
阅读JSTemplate 的源码可以帮助我们理解其内部实现,例如模板字符串如何被解析,以及编译后的函数是如何生成的。这有助于我们在遇到问题时能更深入地调试和优化。 通过以上讲解,我们可以看出JSTemplate 是一种...
使用ArtTemplate提供的`art.template`方法编译模板: ```javascript var template = art.template(document.getElementById('myTemplate').innerHTML); ``` ### (4) 渲染数据 将编译好的模板与数据结合,生成HTML...
2. 编译模板:使用`template.compile()`方法编译模板,得到一个函数。 3. 渲染数据:将编译后的函数与数据对象一起执行,得到HTML字符串。 例如: ```javascript var template = require('art-template'); var ...
1. **模板语法**: artTemplate 提供了一种基于双大括号`{{ }}`的模板语法,例如`{{ variable }}`用于插入变量,`{{#if condition}}...{{/if}}`进行条件判断,`{{#each array}}...{{/each}}`用于遍历数组。...
4. **编译并渲染**:调用`artTemplate.compile()`编译模板,然后使用`template.render(data)`方法将数据渲染到模板。 **四、基础用法** 1. **变量输出**:例如,`{{ name }}`会输出对应数据对象的`name`属性值。 ...
ArtTemplate将JavaScript对象与HTML模板结合,实现数据驱动视图。模板中的表达式会根据数据对象的变化实时更新视图,确保界面与数据同步。 ### 3. XSS防护 ArtTemplate内置了XSS防护机制,对输出的内容进行安全...
1. **简洁的语法**:artTemplate的语法设计简单直观,例如`{{变量名}}`用于输出变量,`{{#each 数组}}...{{/each}}`用于遍历数组,`{{if 条件}}...{{else}}...{{/if}}`用于条件判断。 2. **高效的性能**:由于art...
3. **预编译模板**: 使用`artTemplate.compile()`方法预编译模板,生成模板函数。 4. **渲染数据**: 调用生成的模板函数,传入数据对象,返回HTML字符串。 5. **插入到DOM**: 将生成的HTML字符串插入到合适的位置。 ...
要熟练掌握`template-web`,你需要了解其基本语法,如变量插值、条件语句和循环结构。同时,熟悉API调用和配置方法也是必要的。此外,通过实践编写模板和结合实际项目,可以更好地理解和应用这个工具。 总之,`...
在C++编程中,模板(Template)是一种强大的元编程工具,允许我们在编译时进行泛型编程,实现代码复用并提升效率。标题中的"TmplArgs"可能是一个库或者一个概念,它利用模板技术来分析函数参数,以获取更多的信息并...
"artTemplate" 是一个前端开发中常用的JavaScript模板引擎,它主要用来帮助开发者将数据和HTML结构分离,实现动态内容的渲染。这个名称表明我们要讨论的知识点是关于 "artTemplate" 这个特定的模板库,它在Web应用中...
2. **简洁语法**:`art-template`提供了简单直观的模板语法,如`{{ }}`用于数据绑定,`{{#if}}`和`{{#each}}`用于条件和循环控制,使得开发者可以快速编写模板。 3. **分离关注点**:通过使用模板引擎,开发者可以...
### template模板编译流程 在现代前端开发中,Vue.js 是一个流行的渐进式JavaScript框架,它利用了响应式数据绑定、组件化开发等概念,极大地提升了开发效率。在Vue.js中,编译模板是构建用户界面的一个核心步骤。...
3. **条件判断和循环**:ArtTemplate提供了`{{if}}`、`{{else if}}`、`{{else}}`进行条件判断,以及`{{#each}}`进行循环操作。这使得模板能够根据不同的数据状态展示不同的内容。 4. **函数调用**:在模板中,可以...
- **条件判断**:使用`#if`和`#else`实现条件语句,例如`{{#if user}}...{{else}}...{{/if}}`。 - **循环遍历**:使用`#each`对数组或对象进行遍历,例如`{{#each items}}{{title}}{{/each}}`。 2. **新特性:...
在实际项目中,这两个模板引擎可以结合使用,例如在Web端使用`template-web.js` 渲染用户界面,而在原生应用中用`template-native-debug.js` 进行相似的功能。开发者可以根据项目需求选择合适的模板引擎,并利用它们...
"Particle Factory template.rar_EDEM颗粒工厂API_EDEM颗粒工厂API编译程序_factor"这一文件集合提供了EDEM颗粒工厂API的编程模版,是开发者深入理解和应用EDEM API的重要参考资料。 首先,EDEM颗粒工厂API是EDEM...
2. **缓存优化**:对于重复使用的模板,缓存编译后的结果,避免重复编译。 3. **异步加载**:在非关键路径上延迟加载模板,提高首屏渲染速度。 4. **最小化DOM操作**:避免不必要的DOM操作,利用批量操作如`...