`
ah_fu
  • 浏览: 227870 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

使用template实现条件编译

阅读更多
    我们知道,使用宏可以实现条件编译:
#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 的源码可以帮助我们理解其内部实现,例如模板字符串如何被解析,以及编译后的函数是如何生成的。这有助于我们在遇到问题时能更深入地调试和优化。 通过以上讲解,我们可以看出JSTemplate 是一种...

    模板化工具arttemplate

    使用ArtTemplate提供的`art.template`方法编译模板: ```javascript var template = art.template(document.getElementById('myTemplate').innerHTML); ``` ### (4) 渲染数据 将编译好的模板与数据结合,生成HTML...

    前端插件art-template模板引擎art-template-test示例代码

    2. 编译模板:使用`template.compile()`方法编译模板,得到一个函数。 3. 渲染数据:将编译后的函数与数据对象一起执行,得到HTML字符串。 例如: ```javascript var template = require('art-template'); var ...

    art-template.js

    1. **模板语法**: artTemplate 提供了一种基于双大括号`{{ }}`的模板语法,例如`{{ variable }}`用于插入变量,`{{#if condition}}...{{/if}}`进行条件判断,`{{#each array}}...{{/each}}`用于遍历数组。...

    前端框架artTemplate的使用Demo

    4. **编译并渲染**:调用`artTemplate.compile()`编译模板,然后使用`template.render(data)`方法将数据渲染到模板。 **四、基础用法** 1. **变量输出**:例如,`{{ name }}`会输出对应数据对象的`name`属性值。 ...

    artTemplate模板引擎

    ArtTemplate将JavaScript对象与HTML模板结合,实现数据驱动视图。模板中的表达式会根据数据对象的变化实时更新视图,确保界面与数据同步。 ### 3. XSS防护 ArtTemplate内置了XSS防护机制,对输出的内容进行安全...

    模板化工具 -arttemplate

    1. **简洁的语法**:artTemplate的语法设计简单直观,例如`{{变量名}}`用于输出变量,`{{#each 数组}}...{{/each}}`用于遍历数组,`{{if 条件}}...{{else}}...{{/if}}`用于条件判断。 2. **高效的性能**:由于art...

    artTemplate小实例.zip

    3. **预编译模板**: 使用`artTemplate.compile()`方法预编译模板,生成模板函数。 4. **渲染数据**: 调用生成的模板函数,传入数据对象,返回HTML字符串。 5. **插入到DOM**: 将生成的HTML字符串插入到合适的位置。 ...

    template-web.zip

    要熟练掌握`template-web`,你需要了解其基本语法,如变量插值、条件语句和循环结构。同时,熟悉API调用和配置方法也是必要的。此外,通过实践编写模板和结合实际项目,可以更好地理解和应用这个工具。 总之,`...

    TmplArgs,使用模板技术分析函数参数,从而在编译期得到更多信息和条件

    在C++编程中,模板(Template)是一种强大的元编程工具,允许我们在编译时进行泛型编程,实现代码复用并提升效率。标题中的"TmplArgs"可能是一个库或者一个概念,它利用模板技术来分析函数参数,以获取更多的信息并...

    artTemplate

    "artTemplate" 是一个前端开发中常用的JavaScript模板引擎,它主要用来帮助开发者将数据和HTML结构分离,实现动态内容的渲染。这个名称表明我们要讨论的知识点是关于 "artTemplate" 这个特定的模板库,它在Web应用中...

    art_template.rar 模板引擎

    2. **简洁语法**:`art-template`提供了简单直观的模板语法,如`{{ }}`用于数据绑定,`{{#if}}`和`{{#each}}`用于条件和循环控制,使得开发者可以快速编写模板。 3. **分离关注点**:通过使用模板引擎,开发者可以...

    template 模板是怎样通过 Compile 编译的(2).md

    ### template模板编译流程 在现代前端开发中,Vue.js 是一个流行的渐进式JavaScript框架,它利用了响应式数据绑定、组件化开发等概念,极大地提升了开发效率。在Vue.js中,编译模板是构建用户界面的一个核心步骤。...

    前端js模板引擎artTemplate视频教程.zip

    3. **条件判断和循环**:ArtTemplate提供了`{{if}}`、`{{else if}}`、`{{else}}`进行条件判断,以及`{{#each}}`进行循环操作。这使得模板能够根据不同的数据状态展示不同的内容。 4. **函数调用**:在模板中,可以...

    模板artTemplate

    - **条件判断**:使用`#if`和`#else`实现条件语句,例如`{{#if user}}...{{else}}...{{/if}}`。 - **循环遍历**:使用`#each`对数组或对象进行遍历,例如`{{#each items}}{{title}}{{/each}}`。 2. **新特性:...

    template-web.js

    在实际项目中,这两个模板引擎可以结合使用,例如在Web端使用`template-web.js` 渲染用户界面,而在原生应用中用`template-native-debug.js` 进行相似的功能。开发者可以根据项目需求选择合适的模板引擎,并利用它们...

    Particle Factory template.rar_EDEM颗粒工厂API_EDEM颗粒工厂API编译程序_factor

    "Particle Factory template.rar_EDEM颗粒工厂API_EDEM颗粒工厂API编译程序_factor"这一文件集合提供了EDEM颗粒工厂API的编程模版,是开发者深入理解和应用EDEM API的重要参考资料。 首先,EDEM颗粒工厂API是EDEM...

    javascript-高性能javascript模版引擎-templateEngine.zip

    2. **缓存优化**:对于重复使用的模板,缓存编译后的结果,避免重复编译。 3. **异步加载**:在非关键路径上延迟加载模板,提高首屏渲染速度。 4. **最小化DOM操作**:避免不必要的DOM操作,利用批量操作如`...

Global site tag (gtag.js) - Google Analytics